单例模式

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15

单例模式(Singleton):又称单体模式,是只允许实例化一次的对象类,有时我们也用一个对象来规范一个命名空间,井井有条的管理对象上的属性和方法。

单例模式是JavaScript中最常见的一种模式,一个字面量对象就是一个单例,这种模式经常为我们提供一个命名空间。

var A = {
  Util: {
    util_method1: function() {},
    util_method2: function() {},
  },
  Tool: {
    tool_method1: function() {},
    tool_method2: function() {},
  },
  Ajax: {
    get: function() {},
    post: function() {},
  }
}

使用单例模式模拟静态变量

根据静态变量只能访问不能修改且创建后就能使用,所以,我们将变量放在一个函数里面形成闭包,闭包内部的方法可以访问到这个变量,而同时向外只提供获取变量的方法,不提供修改的方法;而为了保证创建后就能使用,所以采用自执行函数。

var Conf = (function () {
  // 私有变量
  var conf = {
    MAX_NUM: 100,
    MIN_NUM: 1,
    COUNT: 1000
  }

  return {
    get(name) {
      return conf[name];
    }
  }
})()

var c = Conf.get('MAX_NUM');
console.log(c); // 1000

惰性单例

有些时候,对于单例对象需要延迟创建,所以在单例中还存在一种延迟创建的形式,有人称之为“惰性单例”。

var LazySingle = (function () {
  var _instance = null;
  function Single() {
    // 私有属性和方法
    return {
      method1: function() {},
      property1: 1,
    }
  }
  
  // 获取单例对象接口
  return function getSingleObj() {
    if (!_instance) {
      _instance = Single();
    }

    return _instance;
  }
})();

const l = LazySingle(); // LazySingle就是getSingleObj函数,l就是_instance = Single() = 单例对象

console.log(l.property1); // 1

不同于创建私有变量,惰性单例返回的是一个函数而不是一个单例对象,最终是通过调用返回的函数来获得一个单例对象;