单例模式
确保每个类只能创建一个对象
解决什么问题:
在很多业务场景中,一个类的对象只需要也只应该有一份,例如:
- 配置中心(全局配置对象);
- 日志管理器;
- 线程池、连接池等资源管理类;
- 网站的“系统管理器”“任务调度器”等。
如果任由外界随意 new 对象:
- 可能会造成资源浪费(到处都是重复对象);
- 状态难以维护(多份状态容易不一致);
- 管理、调试都变得复杂。
单例模式的目标:全局只存在一个该类的实例,并且对外提供统一的获取入口。
怎么写(饿汉式单例的基本写法):
实现步骤可以记成三句话:
- 把类的构造器私有化 —— 禁止外部代码随意
new; - 在类内部定义一个本类类型的静态变量,记录唯一对象;
- 提供一个公共的静态方法,对外返回这一个对象。
完整示例:
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,同一个对象