標籤:style blog http color java 使用 os io
單體是一個用來劃分命名空間,並將一批相關方法和屬性群組織在一起的對象,如果它可以被執行個體化,那麼它只能被執行個體化一次。
單體模式,就是將程式碼群組織為一個邏輯單元,這個邏輯單元中的代碼可以通過單一的變數進行訪問。
單體基本結構是這樣:
var Singleton = { attribute1:true, attribute2:10, method1:function(){}, method2:function(){}}
藉助閉包實現單體:
Namespace.Singleton = {}
定義之後立即執行的單體函數:
Namespace.Singleton = (function(){ return { publicAttr:1, ...};})();
我們添加那層函數封裝,就是為了使用封裝函數來添加真正的私人成員的閉包。
閉包單體的實現方法:
GiantCorp.DataParser = (function(){ var whitespaceRegex = /\s+/; function stripWhitespace(str){ return str.replace(whitespaceRegex,‘‘); }; function stringSplit(str,delimiter){ return str.split(delimiter); }; return { stringToArray:function(str,delimiter,stripWS){ if(stripWS){ str = stripWhitespace(str); } var outputArray = stringSplit(str,delimiter); return outputArray; } }})();
該函數中,這些私人方法和屬性可以直接存取其名稱,不必在前面加this。把私人成員放到閉包中可以確保其不會在單體對象之外被使用。同時可以自由的改變對象的實現細節。還可以用這種辦法對資料進行保護和封裝。
使用這種方式,你可以享受真正的私人成員帶來的好處,而不必付出什麼代價,這是因為單體類只會被執行個體化一次,單體模式之所以是javascript中最流行的,應用最廣泛的的模式之一,原因即在此。
單體的惰性執行個體化
前面所講的單體模式的實現有一個共同點:單體對象都是指令碼載入的時候被建立出來的。
對於資源密集型的或配置開銷甚大的單體,也許更合理的做法就是將其執行個體化延遲到需要使用的時候,這種技術被稱為惰性載入。它最常用於那些必須載入大量資料的單體。
下面展示如何將普通單體轉化為惰性載入單體:
MyNamespace.Singleton = (function(){ var uniqueInstance; function constructor(){ ..... } return { getInstance:function(){ if(!uniqueInstance){ //沒有執行個體化的情況下 uniqueInstance = constructor(); } return uniqueInstance; } }})();//調用MyNamespace.Singleton.getInstance().publiceMethod1();
分支:分支是一種用來把瀏覽器之間的差異封裝到在運行期間進行折中的動態處理的技術。
下面欣賞使用分支技術建立XHR對象:
var SimpleXhrFactory =(function(){ var standard = { createXhrObject:function(){ return new XMLHttpRequest(); } }; var activeNew = { createXhrObject:function(){ return new ActiveXObject(‘Msxml2.XMLHTTP‘); } }; var activeOld = { createXhrObject:function(){ return new ActiveXObject(‘Microsoft.XMLHTTP‘); } }; var testObject = null; try{ testObject = standard.createXhrObject(); return standard; } catch(e){ try{ testObject = activeNew.createXhrObject(); return activeNew; } catch(e){ try{ testObject = activeOld.createXhrObject(); return activeOld; } catch(e){ throw new Error(‘No XHR object found in this environment.‘); } } }})();
在大型項目中,單體可以起到最佳化的作用:那些開銷大卻又很少使用的組件可以被封裝到惰性載入單體中;針對特點環境的代碼則可以被封裝到分支型單體中。