论坛首页 Java企业应用论坛

java设计模式之单例模式

浏览 2797 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2008-03-02  
1.定义
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。

2.使用场合
简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.
(1)配置信息类
负责配置文件的解析,通常被设计为单例类
(2)管理类
如连接池管理类,通常被设计为单例类
(3)控制类,
如struts的ActionServlet类,也是单例类。
如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>
             org.apache.struts.action.ActionServlet
        </servlet-class>        
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

(4)门面类
说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。
(5)代理类
在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。

3.单例模式在Java语言的实现
单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。
(1)饿汉式单例类
饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。
public class Singleton2{   
    //注意这是private 
    private static Singleton2 theInstance = new Singleton2();   
    //这里提供了一个供外部访问本class的静态方法,可以直接访问  
    public static Singleton2 getInstance(){   
        return theInstance;  
    }   
} 
 


(2)懒汉式单例类
与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。
public class Singleton {   
    public static Singleton theInstance = null;   
    private Singleton(){}   
    public synchronized static Singleton instance(){  
        if(theInstance == null){  
            return new Singleton();  
        }  
        return theInstance;  
    }   
} 
 


(3)登记式单例类
登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。
public class RegSingleton  
{  
    static private HashMap m_registry = new HashMap();  
    static  
    {  
        RegSingleton x = new RegSingleton();  
        m_registry.put(x.getClass().getName(), x);  
    }   
    protected RegSingleton(){   
    }   
    static public RegSingleton getInstance(String name)  
    {  
        if (name == null)  
        {  
            name = "com.javapatterns.singleton.demos.RegSingleton";  
        }  
        if (m_registry.get(name) == null)  
        {  
            try  
            {  
                m_registry.put(name, Class.forName(name).newInstance());  
            }  
            catch (Exception e)  
            {  
                System.out.println("Error happened.");  
            }  
        }  
        return (RegSingleton) (m_registry.get(name));  
    }   
}

登记式单例类的子类
import java.util.HashMap;
public class RegSingletonChild extends RegSingleton
{
public RegSingletonChild() {}
static public RegSingletonChild getInstance()
{
return (RegSingletonChild)
RegSingleton.getInstance(
"com.javapatterns.singleton.demos.RegSingletonChild" );
}

public String about()
{
return "Hello, I am RegSingletonChild.";
}
} 

   发表时间:2008-03-02  
希望对自己的代码加以标示,javaeye有代码块的功能啊,标注上之后估计不会这么快投你隐藏了,别人看着都累
0 请登录后投票
   发表时间:2008-03-02  
谢谢网友寄生虫的提醒。欢迎常来
0 请登录后投票
   发表时间:2008-03-03  
单例是最常见最经典的JAVA设计模式
0 请登录后投票
   发表时间:2008-03-03  
我在面试中被人考过
还好有人提醒
我把代码都记住了
有些有用的,特别是在特殊的场合下还是要记一下代码的,虽然不好.

复习了一次
谢谢
0 请登录后投票
   发表时间:2008-03-03  
“(2)懒汉式单例类” 写的有问题
0 请登录后投票
   发表时间:2008-03-03  
好象一般说 "双重检查锁" 比较好.
我想知道1)饿汉式单例类 有什么缺点呢.
0 请登录后投票
   发表时间:2008-03-03  
写的不错,通过几个小例子对单例模式进行介绍,简单易懂。
0 请登录后投票
   发表时间:2008-03-30  
单例模式适合于没有状态改变的类,巧妙的避免了多实例的产生!
0 请登录后投票
   发表时间:2008-04-05  
前面那个两个见过,后面那个么有见过...
就那么一个对象为什么还要放在hashMap里面呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics