`

单例模式的几种实现方法

    博客分类:
  • Java
阅读更多

1 饿汉式单例类.在类初始化时,已经自行实例化
class EagerSingleton {
  private static final EagerSingleton m_instance = new EagerSingleton();
  /** * 私有的默认构造子 */
  private EagerSingleton() {
  }
  /**
   * * 静态工厂方法
   */
  public static EagerSingleton getInstance() {
    return m_instance;
  }
}2 懒汉式单例类.在第一次调用的时候实例化
class LazySingleton {
  // 注意,这里没有final
  private static LazySingleton m_instance = null;
  /** * 私有的默认构造子 */
  private LazySingleton() {
  }
  /**
   * * 静态工厂方法
   */
  public synchronized tatic LazySingleton getInstance() {
    if (m_instance == null) {
      m_instance = new LazySingleton();
    }
    return m_instance;
  }
}在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java 语言中使用。不十分熟悉的读者,可以看看后面给出的小节。
  同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。
  从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。
  饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定的顺序,因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么GoF 在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java 语言本身的特点。
3 登记式单例类.类似Spring里面的方法,将类名注册,下次从里面直接获取。
import java.util.HashMap;
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 = RegSingleton.class.getName();
    }
    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));
    }
    return null;
  }
  /** * 一个示意性的商业方法 */
  public String about() {
    return "Hello, I am RegSingleton.";
  }
}
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.";
  }
}

分享到:
评论

相关推荐

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

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    单例模式代码实现

    这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看

    单例模式的几种实现方式

    下面将详细介绍单例模式的几种常见实现方式。 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此线程安全。这种方式简单且效率高,但如果单例对象不被使用,会造成内存浪费。 ```java public class...

    7种单例模式

    在多线程环境下,我们需要确保单例实例的创建只发生一次,以上几种方式除了懒汉式(线程不安全)外,都能保证线程安全。对于反序列化测试,由于默认反序列化会生成新实例,需要重写 `readResolve()` 方法来防止这种...

    单例模式单例模式单例模式

    单例模式的应用非常广泛,特别是在以下几种场景中: - **资源管理**:比如数据库连接池、线程池等,这些资源非常宝贵,重复创建不仅浪费资源,还可能引发性能问题。 - **配置信息管理**:如系统配置类,通常只需要...

    单例模式各种实现方式

    以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton...

    几种单例模式demo

    单例模式的实现方式有很多种,下面我们将详细探讨几种常见的单例模式的实现方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private ...

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

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

    java-单例模式几种写法

    在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 `...

    设计模式之单例模式(结合工厂模式)

    此外,单例模式还有几种变体,比如静态内部类单例和枚举单例。静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    首先,实现C#单例模式通常有几种常见方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了实例化,线程安全,但可能导致不必要的内存占用。 ```csharp public class Singleton { private static ...

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

    根据给定的信息,本文将详细解释几种常见的单例模式,并通过具体的Java代码示例来阐述每种模式的特点和实现方式。 ### 单例模式简介 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局...

    单例模式的几种实现方式demo

    下面我们将深入探讨单例模式的几种实现方式。 ### 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此是线程安全的。代码如下: ```java public class Singleton { private static final ...

    设计模式——单例模式

    为了解决懒汉式单例模式的性能问题,有几种优化策略: 1. **双检锁/双重校验锁(DCL,即 double-checked locking)** ```java public class Singleton { private volatile static Singleton instance; private ...

    在Python中实现单例模式.docx

    本文介绍了几种在Python中实现单例模式的方法:使用类装饰器、元类以及 `__new__` 方法。每种方法都有其适用场景,可以根据具体需求选择最合适的方式。无论采用哪种方法,单例模式都能帮助我们在程序中有效地管理...

    设计模式之单例模式(AS3实现)

    为了在AS3中实现单例模式,我们通常会遵循以下几个步骤: 1. **创建类**:首先,我们需要创建一个将被作为单例使用的类。这个类通常包含一些共享的、不需要多次实例化的资源或状态。 ```actionscript public class...

    设计模式之单例模式源码demo

    单例模式的实现方式有很多种,主要分为以下几种: 1. **饿汉单例模式**:在类加载时就完成初始化,因此静态变量`instance`会随着类的加载而被创建。这种方式线程安全,且因为单例在类加载时已经创建,所以不存在多...

    单例模式 C++ 实现

    在C++中实现单例模式,通常有几种常见的方法: 1. **懒汉式**:也称为延迟初始化,只有当第一次调用单例对象时才创建实例。这种做法避免了在程序启动时就创建不必要的对象。不过,如果多个线程同时尝试创建实例,...

    设计模式-单例模式(讲解及其实现代码)

    实现单例模式有多种方式,下面详细介绍几种常见的实现方法: 1. **饿汉式(静态常量)**: 在类加载时就创建了单例对象,这种方式简单且线程安全,但由于类加载时就完成了初始化,所以即使没有使用,也会消耗内存...

Global site tag (gtag.js) - Google Analytics