保证一个类只有一个实例,并提供一个访问该实例的全局节点
- 某个类对于所有客户端只有一个可用的实例
- 需要更加严格的控制全局变量
优点:
- 全局唯一
- 获得了一个指向该实例的全局访问节点
- 可以 lazy 单例节约内存
缺点:
- 违反了单一职责原则
- 单例模式可能掩盖不良设计,比如程序各组件之间相互了解过多
- 该模式在多线程环境下需要进行特殊处理,避免多个线程多次创建单例对象
- 单例的客户端代码单元测试可能会比较困难,因为许多测试框架以基于继承的方式创建模拟对象。
- 外观模式类通常可以转换为单例模式类,因为在大部分情况下一个外观对象就足够
- 将对象的所有共享状态简化为一个享元对象,那么享元模式就和单例类似了。但这两个模式有两个根本性的不同。
- 抽象工厂模式、生成器模式和原型模式都可以用单例来实现
let instance
class Database {
private client: any;
static public getInstance () => {
if (!instance) {
instance = new Database()
}
return instance
}
}
JS 等语言利用自身特性可以轻易实现单例模式
// in Database.ts
let instance;
class Database {}
export const getInstance = () => {
if (!instance) {
instance = new Database();
}
return instance;
};
// in Database.ts
let instance;
class Database {
constructor() {
if (instance) {
return instance;
}
instance = this;
}
}
export default Database;