登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。只是它的子类实例化的方式只能是懒汉式的, 这是无法改变的。
java 代码
- import java.util.HashMap;
-
- 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));
- }
-
- }
它的子类RegSingletonChild 需要父类的帮助才能实例化。
java 代码
- public class RegSingletonChild extends RegSingleton
- {
- public RegSingletonChild()
- {
- }
-
-
-
-
- static public RegSingletonChild getInstance()
- {
- return (RegSingletonChild) RegSingleton.getInstance("com.javapatterns.singleton.demos.RegSingletonChild");
- }
-
- }
在GoF 原始的例子中,并没有getInstance() 方法,这样得到子类必须调用的getInstance(String name)方法并传入子类的名字,因此很不方便。此处在登记式单例类子类的例子里,加入了getInstance() 方法,这样做的好处是RegSingletonChild 可以通过这个方法,返还自已的实例。而这样做的缺点是,由于数据类型不同,无法在RegSingleton 提供这样一个方法。由于子类必须允许父类以构造子调用产生实例,因此,它的构造方法必须是公开的。这样一来,就等于允许了以这样方式产生实例而不在父类的登 记中。这是登记式单例类的一个缺点。
GoF 曾指出,由于父类的实例必须存在才可能有子类的实例,这在有些情况下是一个浪费。这是登记式单例类的另一个缺点。
分享到:
相关推荐
登记式单例类是使用HashMap来存储实例,使用getInstance()方法来获取实例。 代码: ``` import java.util.HashMap; public class RegSingleton { static private HashMap m_registy = new HashMap(); static { ...
登记式单例类通过维护一个映射表(如HashMap)来管理不同类型的单例对象。这种方式类似于框架中的依赖注入模式。 **代码示例**: ```java package pattern.singleton; import java.util.HashMap; import java....
单例模式分为三种:懒汉式单例、饿汉式单例、登记式单例。下面对单例模式的特点、实现方式和应用场景进行详细介绍。 单例模式的特点 1. 单例类只能有一个实例。 2. 单例类必须自己自己创建自己的唯一实例。 3. ...
登记式单例模式虽然不是非常常见,但在某些情况下可以为管理多个单例对象提供方便。 #### 六、总结 单例模式是软件设计中的一个重要组成部分,特别是在Android开发中,它可以帮助我们更好地管理资源和服务。不同的...
3. **登记式单例**:登记式单例实际上是一种管理多个单例类的机制。它维护一个实例列表,每个实例代表一个单例类的唯一实例。这种方式适用于需要管理多个单例的情况。 #### 三、懒汉式单例详解 懒汉式单例的主要...
在Java中,通常有三种常见的单例实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. **懒汉式单例**: 懒汉式单例的特点是在类加载时不创建实例,而是等到第一次调用`getInstance()`方法时才创建。这样可以延迟...
在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...
### 登记式单例模式 登记式单例模式又称为注册式单例模式,它使用一个注册表(通常为HashMap)来管理所有单例对象。当需要某个单例对象时,先检查注册表中是否存在,如果不存在则创建并加入到注册表中。 #### 示例...
在Java中,有三种常见的实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. **懒汉式单例**: 懒汉式单例的特点是在类首次被需要时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有用到单例,就不会...
在Java中,有三种常见的实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. **懒汉式单例**: 懒汉式单例的特点是在类首次被使用时才创建实例,即延迟初始化。这种方式的优点是如果程序始终没有使用到单例,那么...
饿汉式单例类通常会使用静态初始化器(static block)或静态变量来创建实例,如: ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} ...
3. **登记式单例**:这种类型的单例模式通过一个“注册表”(通常是一个`Map`)来管理多个单例类的实例。这种方式适用于需要维护一组单例的情况。 #### 四、示例代码分析 下面分别对三种单例模式的实现方式进行...
登记式单例是一种更灵活的实现方式,它维护了一个内部的Map来存储所有单例类的实例。当请求实例时,首先检查Map中是否存在,如果存在则直接返回,否则创建新的实例并登记。这种方式不仅保证了单例,还可以管理多个...
单例模式是 Java 中一种常见的设计模式,分为懒汉式单例、饿汉式单例和登记式单例三种。单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供...
- **登记式单例**:也称为注册式单例,它维护一个存储单例对象的集合,当需要实例时,首先检查集合中是否存在,存在则直接返回,不存在则创建并添加到集合中。这种方式更加灵活,可以管理一组单例对象,但实现相对...
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_...