跳到主要内容

单例

单例模式解决什么问题?​

  • 问题: 某个类在系统中只允许存在唯一实例, 且需要提供全局访问点;
  • 解法: 把实例缓存为类级静态属性, 第一次访问时创建, 之后复用;
  • 代价: 引入全局状态, 测试与并发场景下需要额外处理;

单例模式包含哪些角色?​

  • Singleton: 定义获取唯一实例的方法, 由该方法保证全局只创建一次;

结构

为什么要把构造函数设为私有?​

  • 目的: 阻止外部用 new 绕过唯一性约束;
  • 结果: 唯一的访问入口是静态方法 getInstance();

如何用 TypeScript 实现单例模式?​

class Singleton {
private static instance: Singleton;

private constructor() {
// 只允许内部创建
}

public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}

const instance0 = Singleton.getInstance();
const instance1 = Singleton.getInstance();
console.log(instance0 === instance1); // true
  • 变体: 静态初始化或模块级单例也可以达到唯一实例的效果, 但不需要类级访问控制;