設計模式與開發實踐之單例模式

思想

  • 確保只有一個實例
  • 提供全局訪問
這麼看來在全局環境下
  var a = {};
  這種形式就知足以上兩條,可是全局變量不是單例模式

代理實現單例模式

  • 代理的做用是實現一個實例的邏輯
var createPop = function (html) {
    this.html = html;
    this.createDom();
}
// 原型上掛載共享屬性和共享的方法
createPop.prototype.createDom = function () {
     var pop = document.createElement('div');
    pop.innnerHTML = this.html;
    document.body.appendChild(pop);
}
var createSingle = (function () {
    var instance;
    return function (html) {
        if(!instance) {
            instance = new createPop(html);
        }
         return instance;
    }
})()
var pop0 =  new createSingle('pop0'); // 這裏new的是createSingle裏面的返回的匿名函數,返回的引用類型的數據(注意)
var pop1 =  new createSingle('pop1');
pop0 === pop1 // true

惰性單例,顧名思義就是在咱們須要的時候在去建立這個單例

  • 將建立對象和管理單例的邏輯分離開來,仍是就上面的例子
    // 業務邏輯
    var createDom = function () {
      var pop = document.createElement('div');
     pop.innnerHTML = this.html;
     document.body.appendChild(pop);
     this.name = '測試'
     return true;
    }
    // 保證只有一個實例
    var createSingle = (function () {
        var instace;
        return function (fn) {
            console.log(this); // 這個匿名被誰掉用,就指向誰,能夠將createDom中的一些屬性綁定到調用的對象上
            // 這裏就將createDom的name屬性掛載到window上
            return instace|| (instace = fn.call(this, arguments))
        }
    })()
    createSingle(createDom);
相關文章
相關標籤/搜索