跳到主要内容

单例模式 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

缺陷

  • 难于扩展(缺少抽象层)
  • 单例类可能被过度使用于不同人物
  • 由于自动垃圾收集,共享的单例对象状态可能会丢失