1. 程式人生 > >js設計模式——單例/單體模式

js設計模式——單例/單體模式

JavaScript中的單例模式是最常用的、最基本的設計模式,它提供了一種名稱空間,減少全域性變數氾濫的程式碼管理機制;

1、最常見的單例模式:

//一般用function定義的類,我才會採用首字母大寫的方法來約定這個變數為類
//而對於這種偽類,我通常習慣於使用駝峰式命名法
var singleton = {
      attr1: '',
      attr2: '',
      method1: function() {},
     method2:  function() {}
};


這是JavaScript開發中最常用的程式碼組織方式,這種方式在JavaScript執行的時候,就已經建立了例項物件。這樣建立的例項物件,所有的屬性、方法都是公開的,有一定的風險;一般使用這樣的單例模式,我們可以採用下劃線_來命名私有變數,來約定為私有變數。但是很不靠譜!

2、閉包方法的單例模式:

var singleton = (function() {
      var _a, _b;    //私有變數
 
     var that = {}; //new某個類
 
     //公開介面
     that.getA = function() {
          return _a;
    };
    that.setA = function(a) {
         _a = a;
    };
 
    that.getB = function() {
         return _b;
    };
    that.setB = function(b) {
         _b = b;
 
    };
 
    return that;   //返回單例
})();


以上這種方法,實現了單例的私有變數對使用者透明,使用者所能知道的只有公開的介面,不能隨意改變私有變數,但是這種方法還是在執行腳步的時候就產生了一個單例,使用者有可能根本就不使用這段程式碼,這樣就會造成記憶體浪費,更好的做法是將類的例項化推遲到需要的時候再例項化;

3、lazy方式的單例模式:

var singleton = (function() {
      var _a, _b; //私有變數    
      var Class = function() {
           //code
      };
     var that = {};
    //公開介面
     that.getA = function() {
         return _a;
    };
    that.setA = function(a) {
        _a = a;
    };
    that.getB = function() {
        return _b;
    };
    that.setB = function(b) {
       _b = b;
    }; 
    var _instance = null;
    var getInstance = function() {
          if(!_instance) {
                 _instance = new Class();
           }   
           return _instance;
    };
     Class.prototype = that;
    return {
          getInstance: getInstance
   };
})();


那麼這種方法就可以在確實需要這段程式碼的時候,才例項化,實現懶惰性的單例模式!