單例模式

單例模式

單例模式是一種保證一個類僅僅擁有一個實例的模式,使用這種模式,全局僅僅有一個該類的實例,它的實現思路是,構造一個類,這個類擁有instance屬性,這個屬性是一個flag,當它爲null時才能創建一個類的實例,並且把實例賦值給它;創建實例使用的一個靜態方法一般命名爲getInstance

實現一個不透明度單例模式

不透明單例特點是就是不能通過new Single來創建單例,而是通過
Single.getInstance,意味着我們必須知道構造函數裏面的getInstance方法,Single構造函數對我們來說不是透明的

// 方法一: 使用this.instance作flag
var Single = function(name){
    this.name = name;
    this.instance = null;// 用來判斷是否已經實例化
}
Single.prototype.getName = function(){
    console.log(this.name);
}
Single.getInstance = function(name){
       if (!this.instance) {
        this.instance = new Single(name);
       }
       return this.instance;
   }
var a = Single.getInstance('jinghong');
var b = Single.getInstance('shao');
console.log(a === b);

// 方法一:使用閉包把參數當作flag
var Single = function(name){
    this.name = name;
}
Single.prototype.getName = function(){
    console.log(this.name);
}
// 自調用函數返回一個函數,這個函數的調用環境和instace構成了閉包,所以在這個函數內部可以修改instance變量
Single.getInstance = (function(name){
       var instance = null;// 用來判斷是否已經實例化
          return function(name){
            if (!instance) instance = new Single(name);
            return instance;
          }
       })();
var a = Single.getInstance('jinghong');
var b = Single.getInstance('shao');
console.log(a === b);


實現透明的單例

透明單例特點是就是不能通過new Single來創建單例,構造函數裏面的內容我們不需要關心,也不用知道,有兩種方法來實現單例:

/ 方法一 
// 用代理實現單例模式
var Single = (function(){
    // instance和Single都在閉包裏面
    var instance = null;
    function Single(name){
        this.name = name;
      }
    Single.prototype.getName = function(){
      console.log(this.name);
    }
    // 下面這個函數返回出去
    return function(name){
      if (!instance) {
        instance = new Single(name);
      }
      return instance;
    }
})();
var a = new Single('jinghong');
var b = new Single('shao');
console.log(a === b);

//方法二
//把控制單例的條件語句下載構造函數裏面
var Single = (function(){
    var instance = null;
    var Single = function(name){
    if (instance) {
        return instance;
    }
    this.name = name;
    instance = this;
}
    Single.prototype.getName = function(){
      console.log(this.name);
    }
    return Single;
})();
var a = new Single('jinghong');
var b = new Single('shao');
console.log(a === b);


javascript中常用惰性單例

在合適的情況才創建對象,並且只創建一個對象
原理:讓getSingle返回一個新的函數,並且用變量result來保存fn的計算結果,result本身在閉包中,永遠不會被銷燬,在將來的請求中,如果result已經被賦值,那麼就會將這個數返回;
應用場景舉例: 將createXhr傳入裏面,如果已經調用了createXhr,再將createXhr傳入裏面,返回的結果仍然是之前調用的結果;

//惰性單例
function getSingle(fn){
   var result;
   return function(){
     return result || (result = fn.apply(this, arguments));
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章