1. 概述
单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点
2. 问题
单例模式同时解决了两个问题,所以违反了单一职责原则:
同时负责管理自己的实例化和控制访问权限,导致了类的职责不单一。
- 保证一个类只有一个实例
- 为该类提供一个全局访问节点
3. 解决方案
所有单例的实现都包含以下两个相同的步骤:
- 将默认构造函数设为私有,防止其他对象使用单例类的
new运算符 - 新建一个静态构建方法作为构造函数。该函数会"偷偷"调用私有构造函数来创建对象,并将其保存在一个静态成员变量中,此后所有对于该函数的调用都将返回这一缓存对象
4. 单例模式结构
5.适用场景
- 如果程序中的某个类对于所有客户端只有一个可用的实例,可以是哟个单例模式
- 如果你需要更加严格地控制全局变量,可以使用单例模式
6.实现方式以及代码实例
实现方式:
- 在类中添加一个私有静态成员变量用于保存单例实例
- 声明一个公有静态构建方法用于获取单例实例
- 在静态方法中实现中实现"延迟初始化",该方法会在首次被调用时创建一个新对象,并将其存储在静态成员变量中,此后该方法每次被调用都返回该实例
- 将类的构造函数设为私有,类的静态方法仍能调用构造函数;但是其他对象不能
- 检查客户端代码,将对单例的构造函数的调用替换为对器静态构建方法的调用
/**
* 单例模式示例
*/
public final class Singleton {
private static Singleton instance = null;
/**
* 私有构造函数,防止外部实例化
*/
private Singleton() {}
/**
* 获取单例实例的静态方法
* @return 单例实例
*/
public static Singleton getInstance() {
// 双重检查锁定,确保线程安全
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}