论坛首页 Java企业应用论坛

登记式单例类

浏览 3685 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-05  
登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。只是它的子类实例化的方式只能是懒汉式的, 这是无法改变的。

java 代码
  1. import java.util.HashMap;  
  2.   
  3. public class RegSingleton  
  4. {  
  5.     static private HashMap m_registry = new HashMap();  
  6.     static  
  7.     {  
  8.         RegSingleton x = new RegSingleton();  
  9.         m_registry.put(x.getClass().getName(), x);  
  10.     }  
  11.   
  12.     /** 
  13.      * 保护的默认构造子 
  14.      */  
  15.     protected RegSingleton()  
  16.     {  
  17.     }  
  18.   
  19.     /** 
  20.      * 静态工厂方法,返还此类惟一的实例 
  21.      */  
  22.     static public RegSingleton getInstance(String name)  
  23.     {  
  24.         if (name == null)  
  25.         {  
  26.             name = "com.javapatterns.singleton.demos.RegSingleton";  
  27.         }  
  28.         if (m_registry.get(name) == null)  
  29.         {  
  30.             try  
  31.             {  
  32.                 m_registry.put(name, Class.forName(name).newInstance());  
  33.             }  
  34.             catch (Exception e)  
  35.             {  
  36.                 System.out.println("Error happened.");  
  37.             }  
  38.         }  
  39.         return (RegSingleton) (m_registry.get(name));  
  40.     }  
  41.   
  42. }  


它的子类RegSingletonChild 需要父类的帮助才能实例化。

java 代码
  1. public class RegSingletonChild extends RegSingleton  
  2. {  
  3.     public RegSingletonChild()  
  4.     {  
  5.     }  
  6.   
  7.     /** 
  8.      * 静态工厂方法 
  9.      */  
  10.     static public RegSingletonChild getInstance()  
  11.     {  
  12.         return (RegSingletonChild) RegSingleton.getInstance("com.javapatterns.singleton.demos.RegSingletonChild");  
  13.     }  
  14.   
  15. }  

在GoF 原始的例子中,并没有getInstance() 方法,这样得到子类必须调用的getInstance(String name)方法并传入子类的名字,因此很不方便。此处在登记式单例类子类的例子里,加入了getInstance() 方法,这样做的好处是RegSingletonChild 可以通过这个方法,返还自已的实例。而这样做的缺点是,由于数据类型不同,无法在RegSingleton 提供这样一个方法。由于子类必须允许父类以构造子调用产生实例,因此,它的构造方法必须是公开的。这样一来,就等于允许了以这样方式产生实例而不在父类的登 记中。这是登记式单例类的一个缺点。

GoF 曾指出,由于父类的实例必须存在才可能有子类的实例,这在有些情况下是一个浪费。这是登记式单例类的另一个缺点。
论坛首页 Java企业应用版

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