JavaScript设计模式「基于ES2024」:创建型模式-单例模式

96 阅读1分钟

在 ES2024 中,我们可以利用类(class)、私有字段和静态方法来实现一个更加优雅和安全的单例模式。

class Singleton {
    static #instance = null;
    #data;

    constructor() {
        if (Singleton.#instance) {
            return Singleton.#instance;
        }
        this.#data = new Map();
        Singleton.#instance = this;
    }

    static getInstance() {
        if (!Singleton.#instance) {
            Singleton.#instance = new Singleton();
        }
        return Singleton.#instance;
    }

    set(key, value) {
        this.#data.set(key, value);
    }

    get(key) {
        return this.#data.get(key);
    }
}

// 使用示例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // 输出: true

instance1.set('name', 'John');
console.log(instance2.get('name')); // 输出: John

实现思路

  1. 静态私有字段 #instance: 用于存储单例实例,确保外部无法直接访问或修改。
  2. 构造函数检查: 在构造函数中检查实例是否已经存在,如果存在则返回该实例,从而确保只创建一个实例。
  3. 静态方法 getInstance(): 提供全局访问点,通过此方法确保只创建一个实例。
  4. 私有字段 #data: 用于存储数据,防止外部直接访问和修改数据。
  5. 数据操作方法: 提供 setget 方法来操作内部数据,确保数据访问的控制和一致性。

优点

  • 线程安全: JavaScript 是单线程的,这种实现保证多次调用时只有一个实例。
  • 延迟初始化: 单例实例仅在第一次使用时被创建。
  • 封装性好: 利用私有字段,防止外部直接访问和修改内部状态。