typescript实现单例模式

197 阅读1分钟

要点

  1. 通过函数来创建对象,不能在类外部通过 new 创建对象
  2. 确保多次调用后,仍然只有一个实例

思路

  1. 构造函数私有,确保无法在类外部使用 new 创建对象
  2. 一个私有静态属性,保存创建出的对象
  3. 一个公开的静态函数,返回创建的对象;在函数内部,先判断是否已创建对象,如果已创建,就直接返回私有静态属性;如果还没创建,就使用 new 创建对象,保存并返回私有静态属性

实现

  1. 为了编程方便,这里使用了 typescript 语言,可以用面向对象,和 private static 等语法。
  2. 为了简便,这里没有对 Singleton 类的对象添加其他非静态属性
  3. 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. 双重检查锁)。