es6 语法学习 - 单例模式

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负责提供对这个唯一实例的访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值