js单例模式和多例模式怎么实现?

188 阅读2分钟

单例模式和多例模式都是设计模式中的创建型模式,用于控制对象的创建过程。它们的主要目的是确保在特定条件下只创建一个实例(单例模式)或有限个实例(多例模式)。

1. 单例模式:

单例模式确保一个类只有一个实例,并提供全局访问点来获取该实例。

实现单例模式的常见方式是使用一个闭包来封装类的实例,并通过一个静态方法来获取这个实例。以下是一个JavaScript中的简单单例模式实现:

const Singleton = (function() {
  let instance;

  function createInstance() {
    // 在这里创建实例
    return {
      // 对象的属性和方法
    };
  }

  return {
    getInstance: function() {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    }
  };
})();

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

console.log(instance1 === instance2); // 输出: true,因为只有一个实例

2. 多例模式:

多例模式是指一个类有限个实例,且每个实例都有固定的名称或标识符。

实现多例模式的方式也可以使用闭包,通过一个对象来存储不同实例,并提供静态方法来获取这些实例。以下是一个简单的JavaScript多例模式实现:

const MultiInstance = (function() {
  let instances = {};

  function createInstance(name) {
    // 在这里创建实例
    return {
      name: name,
      // 对象的属性和方法
    };
  }

  return {
    getInstance: function(name) {
      if (!instances[name]) {
        instances[name] = createInstance(name);
      }
      return instances[name];
    }
  };
})();

// 使用多例
const instance1 = MultiInstance.getInstance('instance1');
const instance2 = MultiInstance.getInstance('instance2');

console.log(instance1 === instance2); // 输出: false,因为是两个不同的实例

在这个示例中,我们使用名为instance1instance2的名称来获取不同的实例,确保每个实例都有唯一的名称,并且可以通过getInstance方法获取对应名称的实例。

这些只是单例模式和多例模式的基本实现方式,具体应用和设计要根据实际需求来考虑。在现代JavaScript中,通常使用模块模式或ES6的类来实现这些模式,这样更符合现代JS的开发规范和语法。