要点
- 通过函数来创建对象,不能在类外部通过
new创建对象 - 确保多次调用后,仍然只有一个实例
思路
- 构造函数私有,确保无法在类外部使用
new创建对象 - 一个私有静态属性,保存创建出的对象
- 一个公开的静态函数,返回创建的对象;在函数内部,先判断是否已创建对象,如果已创建,就直接返回私有静态属性;如果还没创建,就使用
new创建对象,保存并返回私有静态属性
实现
- 为了编程方便,这里使用了 typescript 语言,可以用面向对象,和 private static 等语法。
- 为了简便,这里没有对 Singleton 类的对象添加其他非静态属性
- Singleton.instance 的创建,可以在类初始化时创建(饥饿模式),也可以在函数执行时才创建(懒惰模式)
class Singleton {
private static instance: Singleton;
private constructor() {}
public static create() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}
测试代码
const obj = Singleton.create();
const obj2 = Singleton.create();
console.log(obj === obj2);
注意事项
由于 js 是单线程环境下运行的,所以不用考虑多线程并发的场景。对于 java 等多线程语言,还需要考虑线程安全(e.g. 双重检查锁)。