javascript設計模式學習之四——單例模式,緩存與對象池


單例模式的定義:確保一個實例,並提供全局訪問。

惰性單例的定義:只在需要的時候才創建對象。

在開發中,有些對象往往只需要一個,比如線程池、全局緩存、瀏覽器中的window對象等。

java中的單例

關鍵在於使用一個變量來標志當前是否為某個類創建過對象。

public class Singleton {  
    private Singleton() {}  
    private static Singleton single=null;  
    //靜態工廠方法   
    public static Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
    
   }
}

這樣的單例類有一定的“不透明性”,其使用者必須知道這是一個單例類,不能通過New xxx的方式創建實例,而是需要使用Singleton.getInstance方法來獲取對象。

javascript中的單例模式

根據單例模式的特點:1)只有一個實例,2)對外提供全局訪問;

1)javascript中的全局對象自變量無疑符合單例的特征,但其缺點是不可避免會有全局污染的問題;

2)下面是一種通用的惰性單例的實現方法

 

        document.addEventListener('DOMContentLoaded',function(){
      //getSingle是創建單例通用的方法
var getSingle=function(fn){ var ret; return function(){ return ret||(ret=fn.apply(this,arguments)); }; }; //下面以創建唯一的登陸浮窗為例 var createLoginLayer=function(){ var div=document.createElement('div'); div.innerHTML='我是登陸浮窗'; document.body.appendChild(div); return div; }; var getSingleLoginLayer=getSingle(createLoginLayer); var div1=getSingleLoginLayer(); var div2=getSingleLoginLayer(); console.log(div1===div2); //輸出true },false);

變量緩存

 如果ret不是基本變量,而是一個對象,則可以用來實現緩存,在jQuery的源代碼中有很多這樣的例子。

    var cache={};//一般定義為一個全局變量
    var tmp=cache[key]||fn(key);

對象池

對象池維護一個裝載着空閑對象的池子,如果需要對象的時候,不是直接new,而是從對象池中取出,如果對象池中沒有空閑對象,則新建一個空閑對象。對象池技術的使用非常廣泛,http連接池和數據庫連接池都是其代表。在web前端中,對象池使用最多的使得DOM有關的操作。

對象池的實現:

 

//對象池
var objectPoolFactory=function(createObjFn){
    var pool=[],
        create=function(){
            var obj=pool.length>0?pool.shift():createObjFn.apply(this,arguments);            
            return obj;
        },
        recover=function(obj){
            pool.push(obj);
        };
    return {
        create:create,
        recover:recover,
    };
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM