单例设计模式是工具类的一种设计模式。
规范:一个类在内存中只会有一个实例化对象

什么是单例设计模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。

具体实现

  1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
  2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。
  3. 定义一个静态方法返回这个唯一对象。

    类结构图

    单例设计模式 - 图1

    立即加载/饿汉模式

    立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。

    1. public class Singleton {
    2. // 将自身实例化对象设置为一个属性,并用static修饰
    3. private static Singleton instance;
    4. // 构造方法私有化
    5. private Singleton() {}
    6. // 静态方法返回该实例
    7. public static Singleton getInstance() {
    8. if(instance == null) {
    9. instance = new Singleton();
    10. }
    11. return instance;
    12. }
    13. }

    饿汉模式的优缺点:

  • 优点:实现起来简单,没有多线程同步问题。
  • 缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

    延迟加载/懒汉模式

    延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。

    线程安全的懒汉模式

    DCL双检查锁机制

    参考:设计模式之单例模式