单例模式 Singleton

产生唯一的实例,限制实例的数量只有一个。在 Java 中采用不定义无参构造函数,定义静态getInstance()方法的形式只返回唯一实例来实现 在 JavaScript 中没有类的概念,而且要考虑的方面也更多(例如 DOM),所以情况比较特殊

<!-- bad -->
var createMask = function(){
  return document,body.appendChild(  document.createElement(div)  );
}

$( 'button' ).click( function(){
  var mask  = createMask();
  mask.show();
});

<!-- singleton -->
var createMask = function(){
  var mask;
  return function(){
    return mask || ( mask = document.body.appendChild( document.createElement('div') ) )
  }
}();// 利用闭包和IIFE 返回实例,这样既保证了唯一性,又保证了封装性;

$('button').click( function() {
  mask.show();
});

> 我们还可以封装一个Singleton的包装器

var singleton = function(fn){
  let instance;
  return function(){
    instance || (instance = fn.apply(this,arguments));
  }
}();

var createMask = singleton( function(){
  return document.body.appendChild( document.createElement('div') );
});
const Singleton = (function () {
  let instance; // 实例

  function init() {
    return {
      publicProperty: "I am a property",
      publicMethod: function () {
        console.log("I am a method");
      },
    };
  }

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

// 获取实例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

参考资料

常用的 Javascript 设计模式

results matching ""

    No results matching ""