单例模式 Singleton Pattern
定义
每个类只有一个实例 创建前判断实例是否存在,存在就直接返回,不存在再创建
确保一个类只有一个实例,并提供一个全局点用来访问。这样的类被称为 singleton class
三个关键性质
- 每个类在内存中只会有一个实例
- 实例必须被这个类创建
- 实例必须被整个系统访问
实现 Lazy Singleton (懒汉式单例类)
访问点负责创造并返回实例

- 私有的构造器(私有则不会被重复构造)
- static private member variable (是自身的类型,私有不会被重复修改)
- static public factory method (公共的创建和访问点)
Eager Singleton (饿汉式单例类)
在单例类被创建后会立即创建实例,访问点只需要返回实例就行

案例
其他例子:点击按钮显示弹窗;redux 的 store; 正常情况电脑系统只能打开一个任务管理器
闭包实现单例模式
class CreateUser {
constructor(name) {
this.name = name;
this.getName();
}
getName() {
return this.name;
}
}
// 实现单例模式
const ProxyMode = (function () {
let instance = null;
return function (name) {
if (!instance) {
instance = new CreateUser(name);
}
return instance;
};
})();
// 测试
const a = new ProxyMode("aaa");
const b = new ProxyMode("bbb");
console.log(a === b); // true
优点
- 提供了对独一无二实例的受控访问
- 可以节约系统资源并提升系统性能
- 允许可变的实例数量(multion class)
- array: Multiton[]
- Multition()
+ getInstance(): Multition
+ random(): int
缺陷
- 难于扩展(缺少抽象层)
- 单例类可能被过度使用于不同人物
- 由于自动垃圾收集,共享的单例对象状态可能会丢失