问题定义

如何确保一个类只有一个实例,并提供一个全局访问点,以便在应用程序的任何地方都可以访问该实例?

步骤与流程

  1. 创建私有构造函数: 将类的构造函数设置为私有,防止外部通过 new 关键字创建实例。
  2. 创建静态实例: 在类内部创建一个静态实例,用于存储唯一的实例。
  3. 创建静态方法: 创建一个静态方法,用于获取唯一的实例。如果实例不存在,则创建实例并返回;如果实例已存在,则直接返回。

前端示例

// 单例模式示例
class Singleton {
  constructor() {
    if (Singleton.instance) {
      return Singleton.instance;
    }
    this.data = 'Singleton instance';
    Singleton.instance = this;
  }
 
  getData() {
    return this.data;
  }
}
 
// 获取单例实例
const instance1 = new Singleton();
const instance2 = new Singleton();
 
// 验证是否为同一个实例
console.log(instance1 === instance2); // true
console.log(instance1.getData()); // Singleton instance

应用场景

  1. 管理应用程序的状态: 使用单例模式管理应用程序的状态,确保只有一个状态实例。
  2. 管理配置信息: 使用单例模式管理配置信息,确保只有一个配置实例。
  3. 管理共享资源: 使用单例模式管理共享资源,如数据库连接、缓存或日志记录器。
  4. 创建模态框: 使用单例模式创建模态框,确保只有一个模态框实例。
  5. 创建全局事件总线: 使用单例模式创建全局事件总线,用于组件之间的通信。

注意事项

  1. 线程安全: 在多线程环境中,需要考虑线程安全问题,确保单例实例的创建是线程安全的。
  2. 延迟加载: 可以使用延迟加载(lazy loading)来优化单例实例的创建,只有在需要时才创建实例。
  3. 避免过度使用: 单例模式可能会导致代码的耦合性增加,因此应该避免过度使用。

参考资料