單體模式提供了一種將代碼組織為一個邏輯單元的手段,這個邏輯單元中的代碼可以通過單一變量進行訪問。
單體模式的優點是:
可以用來劃分命名空間,減少全局變量的數量。 使用單體模式可以使代碼組織的更為一致,使代碼容易閱讀和維護。 可以被實例化,且實例化一次。什么是單體模式?單體模式是一個用來劃分命名空間并將一批屬性和方法組織在一起的對象,如果它可以被實例化,那么它只能被實例化一次。
但是并非所有的對象字面量都是單體,比如說模擬數組或容納數據的話,那么它就不是單體,但是如果是組織一批相關的屬性和方法在一起的話,那么它有可能是單體模式,所以這需要看開發者編寫代碼的意圖;
下面我們來看看定義一個對象字面量(結構類似于單體模式)的基本結構如下:
// 對象字面量var Singleton = { attr1: 1, attr2: 2, method1: function(){ return this.attr1; }, method2: function(){ return this.attr2; }};如上面只是簡單的字面量結構,上面的所有成員變量都是通過Singleton來訪問的,但是它并不是單體模式;因為單體模式還有一個更重要的特點,就是可以僅被實例化一次,上面的只是不能被實例化的一個類,因此不是單體模式;對象字面量是用來創建單體模式的方法之一;
使用單體模式的結構如下demo
我們明白的是單體模式如果有實例化的話,那么只實例化一次,要實現一個單體模式的話,我們無非就是使用一個變量來標識該類是否被實例化,如果未被實例化的話,那么我們可以實例化一次,否則的話,直接返回已經被實例化的對象。
如下代碼是單體模式的基本結構:
// 單體模式var Singleton = function(name){ this.name = name; this.instance = null;};Singleton.prototype.getName = function(){ return this.name;}// 獲取實例對象function getInstance(name) { if(!this.instance) { this.instance = new Singleton(name); } return this.instance;}// 測試單體模式的實例var a = getInstance("aa");var b = getInstance("bb");// 因為單體模式是只實例化一次,所以下面的實例是相等的console.log(a === b); // true
由于單體模式只實例化一次,因此第一次調用,返回的是a實例對象,當我們繼續調用的時候,b的實例就是a的實例,因此下面都是打印的是aa;
console.log(a.getName());// aaconsole.log(b.getName());// aa
上面的封裝單體模式也可以改成如下結構寫法:
// 單體模式var Singleton = function(name){ this.name = name;};Singleton.prototype.getName = function(){ return this.name;}// 獲取實例對象var getInstance = (function() { var instance = null; return function(name) { if(!instance) { instance = new Singleton(name); } return instance; }})();// 測試單體模式的實例var a = getInstance("aa");var b = getInstance("bb");// 因為單體模式是只實例化一次,所以下面的實例是相等的console.log(a === b); // trueconsole.log(a.getName());// aaconsole.log(b.getName());// aa
新聞熱點
疑難解答
圖片精選