Skip to content
On this page

单例模式

TIP

JavaScript 单例模式是一种限制类实例化次数的设计模式,可以确保一个类只有一个实例,并提供对该实例的全局访问点。

以下是一个简单的 JavaScript 单例模式示例:

javascript
// 单例对象
const mySingleton = (function () {
  // 实例引用
  let instance;

  function init() {
    // 私有方法和变量
    function privateMethod() {
      console.log("I am private!");
    }

    const privateVariable = "I'm also private";

    return {
      // 公共方法和变量
      publicMethod: function () {
        console.log("The public can see me!");
      },

      publicProperty: "I am also public",

      // 获取单例实例方法
      getInstance: function () {
        if (!instance) { // 如果没有实例,则创建一个新实例
          instance = init();
        }

        return instance;
      },
    };
  }

  return {
    // 获取单例实例方法
    getInstance: function () {
      if (!instance) {
        instance = init();
      }

      return instance;
    },
  };
})();

// 创建单例实例
const singletonInstance1 = mySingleton.getInstance();
const singletonInstance2 = mySingleton.getInstance();

console.log(singletonInstance1 === singletonInstance2); // true,两个实例相同

在上面的示例中,我们定义了一个单例对象 mySingleton,它包含了私有成员和公有成员。其中,私有成员被封装在 init 函数内部,并通过闭包的方式返回,以便外部无法访问。

为了确保该单例只被实例化一次,我们使用了一个 instance 变量来存储实例引用。当第一次调用 getInstance 方法时,会检查 instance 是否存在。如果不存在,则创建一个新的实例,否则直接返回现有的实例。

最后,我们通过调用 mySingleton.getInstance 两次来测试单例模式是否有效。由于两个实例相同,因此比较它们的引用会得到 true 的结果。

TIP

单例模式的优点是可以确保全局只有一个实例,并提供对该实例的全局访问点,从而方便地共享状态和资源。

Released under the MIT License.