es6 语法学习 - 单例模式
一、基本概念
单例设计模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式通常用于管理共享资源,如日志记录、配置信息或数据库连接
2.优点
- 保证唯一性:确保一个类只有一个实例,从而控制对资源的访问。
- 全局访问:提供了全局访问点,容易访问单一实例。
- 延迟实例化:可以在需要时创建实例,而不是程序启动时。
三、缺点
- 隐式依赖:单例模式可能导致代码间的隐式依赖,难以管理,尤其是在大型系统中,可能会增加维护的复杂性。
- 难以测试:由于单例始终返回同一实例,测试时可能会遇到状态共享的问题,使得单元测试更加困难,特别是在需要清理状态时。
- 多线程问题:在多线程环境中,单例可能会发生实例竞争,导致出现多个实例的问题,需要额外的同步机制来解决。
四、使用场景
- 需要控制资源的访问,如数据库连接、文件处理等。
- 应用程序全局配置,比如应用程序的配置管理。
- 日志管理,确保所有的日志都来自同一个源。
五、示例代码
利用了 ES6 的类语法和静态属性,但没有真正的私有构造函数:
class Singleton {
constructor() {
if (Singleton.instance) {
throw new Error(
'Use Singleton.getInstance() to get the single instance of this class.'
);
}
Singleton.instance = this;
// 初始化代码...
this.someProperty = 'some value';
}
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
someMethod() {
console.log('Singleton method called');
console.log(this.someProperty);
}
}
// 使用单例
const singleton1 = Singleton.getInstance();
singleton1.someMethod(); // 输出: Singleton method called 和 some value
const singleton2 = Singleton.getInstance();
console.log(singleton1 === singleton2); // 输出: true,证明是单例
// 尝试直接实例化会抛出错误
const singleton3 = new Singleton(); // Uncaught Error: Use Singleton.getInstance() to get the single instance of this class.
在这个简化的版本中,我们直接在Singleton类上定义了一个静态属性instance来持有类的唯一实例。构造函数在创建新实例之前检查这个属性,如果已经存在实例,则抛出错误。静态方法getInstance负责提供对这个唯一实例的访问。
1089

被折叠的 条评论
为什么被折叠?



