JavaScript基礎對象建立模式之單體/單例模式(Singleton)

首先,單例模式是對象的建立模式之一,此外還包括工廠模式。單例模式的三個特色:
  1,該類只有一個實例
  2,該類自行建立該實例(在該類內部建立自身的實例對象)
  3,向整個系統公開這個實例接口
  Java中大概是這個樣子:javascript

class Singleton {

    //私有,靜態的類自身實例
    private static Singleton instance = new Singleton();

    //私有的構造子(構造器,構造函數,構造方法)
    private Singleton(){}

   //公開,靜態的工廠方法
   public static Singleton getInstance() { 
      return instance;
   }
}

 使用時:java

Singleton obj = Singleton.getInstance();

    這個單例類在自身被加載時instance會被實例化,即使加載器是靜態的。所以,對於資源密集,配置開銷較大的單體更合理的作法是將實例化(new)推遲到使用它的時候。即惰性加載(Lazy loading),它經常使用於那些必須加載大量數據的單體。修改下:瀏覽器

class LazySingleton {
   //初始爲null,暫不實例化
   private static LazySingleton instance = null;

   //私有的構造子(構造器,構造函數,構造方法)
   private LazySingleton(){}

   //公開,靜態的工廠方法,須要使用時纔去建立該單體
   public static LazySingleton getInstance() {
       if( instance == null ) {
         instance = new LazySingleton();
      }
      return instance;
    }
}

 使用方式同上。
  單例模式是Javascript最基本,最有用的模式之一。它提供了一種將代碼組織爲一個邏輯單元的手段,這個邏輯單元中的代碼經過單一的變量進行訪問。
  單體在Javascipt中有許多用處,能夠用來劃分命名空間,以減小全局變量的泛濫。還能夠用在分支技術中用來處理各瀏覽器的差別。
  Javascript中單例模式的實現方式有多種,每一種都有自身的優勢或缺點。閉包

  1,對象直面量實現最基本,最簡單的單體     dom

var Singleton = {
   attr1 : 1,
   attr2 : 'hello',
   method1 : function(){alert(this.attr2);},
   method2 : function(arg){}
}

 這種方式中,對象全部成員都經過Singleton加點號訪問。全部成員是公開的,沒有私有的。在執行到變量Singleton時,會加載(實例化)自身,即非惰性加載。
  此外method1用this訪問單體的其它成員會存在一些風險,由於method1的上下文不是老是指向Singleton對象。
  好比當把method1做爲事件監聽器時,this可能指向的是dom元素,這時可能會提示undefined。函數

  2,閉包實現私有成員的單體this

var Singleton = function(){
   var attr = 1, fn = function(){};
   return {
       method : function(){ fn(); },
       getAttr : function(){ return attr; }
    };
}();

 這種方式中var定義私有的成員屬性attr,方法fn,而後返回一個公開的接口method和getAttr。從此修改實現時,接口方法method和getAttr不變,只需修改私有的attr和fn的具體實現。使用以下:對象

Singleton.method();
Singleton.getAttr();

 3,閉包實現私有成員的惰性實例化單體blog

var LazySingleton = function(){
  var attr = 1, fn = function(){};
  var obj = {
     method : function(){ fn(); },
     getAttr : function(){ return attr; }
  };
  function init(){
     return obj;
  }
   return {getInstace: init};
}();

 

 適用場合上面已經提到:對於那些必須加載大量數據的單體直到須要使用它的時候才實例化。使用方式是這樣:接口

LazySingleton.getInstance().method();
LazySingleton.getInstance().getAttr(); 
相關文章
相關標籤/搜索