My App

单例模式

确保每个类只能创建一个对象

解决什么问题:

在很多业务场景中,一个类的对象只需要也只应该有一份,例如:

  • 配置中心(全局配置对象);
  • 日志管理器;
  • 线程池、连接池等资源管理类;
  • 网站的“系统管理器”“任务调度器”等。

如果任由外界随意 new 对象:

  • 可能会造成资源浪费(到处都是重复对象);
  • 状态难以维护(多份状态容易不一致);
  • 管理、调试都变得复杂。

单例模式的目标:全局只存在一个该类的实例,并且对外提供统一的获取入口

怎么写(饿汉式单例的基本写法):

实现步骤可以记成三句话:

  1. 把类的构造器私有化 —— 禁止外部代码随意 new
  2. 在类内部定义一个本类类型的静态变量,记录唯一对象
  3. 提供一个公共的静态方法,对外返回这一个对象

完整示例:

public class Singleton {
    // 2. 在类内部创建本类的唯一对象(饿汉式:类加载时就创建好)
    private static final Singleton INSTANCE = new Singleton();

    // 1. 构造器私有化,外部不能 new
    private Singleton() {
    }

    // 3. 对外提供一个公共静态方法,返回唯一对象
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

使用方式:

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2);  // true,同一个对象

记忆:构造器私有化 + 静态成员变量存唯一对象 + 静态方法对外返回对象,就是最典型的单例模式写法。

懒汉式单例

懒汉式单例的写法比较简单,只需要在类内部定义一个本类类型的静态变量,记录唯一对象,然后在类内部提供一个公共的静态方法,对外返回这一个对象。

完整示例:

public class Singleton {
    // 2. 在类内部创建本类的唯一对象(懒汉式:需要时才创建)
    private static Singleton INSTANCE;

    // 1. 构造器私有化,外部不能 new
    private Singleton() {
    }

    // 3. 对外提供一个公共静态方法,返回唯一对象
    public static Singleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}

使用方式:

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2);  // true,同一个对象

On this page