`
phantomhu
  • 浏览: 20063 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

登记式单例类

 
阅读更多
登记式单例类是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单例模式及实现

    登记式单例类是使用HashMap来存储实例,使用getInstance()方法来获取实例。 代码: ``` import java.util.HashMap; public class RegSingleton { static private HashMap m_registy = new HashMap(); static { ...

    JAVA单例模式的几种实现方法

    登记式单例类通过维护一个映射表(如HashMap)来管理不同类型的单例对象。这种方式类似于框架中的依赖注入模式。 **代码示例**: ```java package pattern.singleton; import java.util.HashMap; import java....

    单例模式详解

    单例模式分为三种:懒汉式单例、饿汉式单例、登记式单例。下面对单例模式的特点、实现方式和应用场景进行详细介绍。 单例模式的特点 1. 单例类只能有一个实例。 2. 单例类必须自己自己创建自己的唯一实例。 3. ...

    Android单例模式

    登记式单例模式虽然不是非常常见,但在某些情况下可以为管理多个单例对象提供方便。 #### 六、总结 单例模式是软件设计中的一个重要组成部分,特别是在Android开发中,它可以帮助我们更好地管理资源和服务。不同的...

    单例模式讲解

    3. **登记式单例**:登记式单例实际上是一种管理多个单例类的机制。它维护一个实例列表,每个实例代表一个单例类的唯一实例。这种方式适用于需要管理多个单例的情况。 #### 三、懒汉式单例详解 懒汉式单例的主要...

    Java实现单例模式[汇编].pdf

    在Java中,通常有三种常见的单例实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. **懒汉式单例**: 懒汉式单例的特点是在类加载时不创建实例,而是等到第一次调用`getInstance()`方法时才创建。这样可以延迟...

    Java设计模式之单例模式的七种写法

    在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...

    几种单例模式说明(并有实例)

    ### 登记式单例模式 登记式单例模式又称为注册式单例模式,它使用一个注册表(通常为HashMap)来管理所有单例对象。当需要某个单例对象时,先检查注册表中是否存在,如果不存在则创建并加入到注册表中。 #### 示例...

    Java单例模式[归类].pdf

    在Java中,有三种常见的实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. **懒汉式单例**: 懒汉式单例的特点是在类首次被需要时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有用到单例,就不会...

    Java单例模式.pdf

    在Java中,有三种常见的实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. **懒汉式单例**: 懒汉式单例的特点是在类首次被使用时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有使用到单例,那么...

    Java中单例模式详解

    饿汉式单例类通常会使用静态初始化器(static block)或静态变量来创建实例,如: ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} ...

    java单例模式

    3. **登记式单例**:这种类型的单例模式通过一个“注册表”(通常是一个`Map`)来管理多个单例类的实例。这种方式适用于需要维护一组单例的情况。 #### 四、示例代码分析 下面分别对三种单例模式的实现方式进行...

    Java单例模式[定义].pdf

    登记式单例是一种更灵活的实现方式,它维护了一个内部的Map来存储所有单例类的实例。当请求实例时,首先检查Map中是否存在,如果存在则直接返回,否则创建新的实例并登记。这种方式不仅保证了单例,还可以管理多个...

    单例模式讲解说明与实例

    单例模式是 Java 中一种常见的设计模式,分为懒汉式单例、饿汉式单例和登记式单例三种。单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供...

    java单例设计模式的好处

    - **登记式单例**:也称为注册式单例,它维护一个存储单例对象的集合,当需要实例时,首先检查集合中是否存在,存在则直接返回,不存在则创建并添加到集合中。这种方式更加灵活,可以管理一组单例对象,但实现相对...

    7种单例模式

    7. **登记式/注册式单例**: 使用 Map 存储实例,适用于需要多个类似单例的场景。 ```java public class SingletonRegistry { private static final Map, Object> registry = new HashMap(); public static ...

    单例模式的要点及模式

    登记式单例通过一个注册表来存储所有已创建的实例,适用于需要按名称获取单例的情况。这种方式线程安全,但增加了系统复杂性。 ```java public class RegSingleton { private static Map, RegSingleton> m_...

Global site tag (gtag.js) - Google Analytics