单例模式实现及分析
- 单例模式结合 ES6 类的实现
class Singleton {
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
this.data = "这是单例实例的数据";
Singleton.instance = this;
return this;
}
}
// 使用示例
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true
- 适用业务场景及优势
- 场景:在应用程序中,某些资源只需要一个实例来管理,如全局状态管理、数据库连接池等。以全局状态管理为例,应用程序中可能存在一个全局的用户登录状态,无论在哪个模块访问,都应该是同一个状态实例。
- 优势:避免多次创建相同实例带来的资源浪费,提高资源利用率。同时,确保全局只有一个实例,方便数据的统一管理和维护。在数据库连接池场景下,若每次需要数据库操作都创建新的连接实例,会消耗大量资源,单例模式的连接池实例可以复用连接,提升性能。
- 潜在问题及解决方案
- 问题:
- 全局变量污染:单例模式本质上会创建一个全局可访问的实例,可能会与其他全局变量冲突。
- 测试困难:由于单例的唯一性,在测试时难以创建多个独立的实例用于不同测试场景。
- 解决方案:
- 针对全局变量污染:将单例的创建和访问封装在一个模块内,通过 ES6 的模块系统,将单例实例作为模块的导出对象,减少与外部全局变量的冲突。例如,将上述 Singleton 类的定义放在一个单独的
singleton.js
文件中,使用时通过 import
导入。
- 针对测试困难:在测试框架中,可以通过依赖注入的方式,在测试时传入模拟的单例实例。例如,在测试某个依赖单例的函数时,将模拟的单例实例作为参数传入函数,而不是直接在函数内部获取真实的单例实例。这样可以在不同测试用例中使用不同的模拟实例,便于测试。