1. 程式人生 > >設計模式與開發實踐之單例模式

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

思想

  • 確保只有一個例項
  • 提供全域性訪問
  這麼看來在全域性環境下
  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);