摘要:的構造函數實際上負責了兩件事情。有一個缺點,假如我們某天需要利用這個類,在頁面中創建千千萬萬個,即要這個類從單例類變成一個普通的可產生多個實例的類,那我們就要改寫構造函數,把控制創建唯一對象的那一段去掉,這樣會給我們帶來不必要的麻煩。
定義:單例模式保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
單例模式是一種常用的模式,有一些對象我們往往只需要一個,比如線程池、全局緩存、瀏覽器中的window對象等。當我們創建的對象只會被創建一次時,這個時候就適合用單例模式來創建,因為當我們點擊登錄按鈕的時候,頁面會出現一個懸浮窗,而這個懸浮窗是唯一的,無論單擊多少次登錄按鈕,這個只會被創建一次。
實現單例模式
實現一個標準的單例模式,用一個變量來標志當前是否已經為某個類創建過對象,如果是,則在下一次獲取該類的實例時,直接返回之前創建的對象。代碼如下: var Singleton = function( name ){ this.name = name; this.instance = null; }; Singleton.prototype.getName = function(){ alert( this.name ); }; Singleton.getIstance = function( name ){ if( !instance ){ this.instance = new Singleton( name ); } return this.instance; }; var a = Singleton.getInstance( "tom" ); var b = Singleton.getInstance( "sun" ); alert( a===b ); //true
我們通過Singleton.getInstance來獲取Singleton類的唯一對象,簡單,但有一個問題,就是增加了這個類的“不透明性”,Singleton類的使用者必須知道這是一個單例類,跟以往通過new XXX的方式來獲取對象不同,這里偏要使用Singleton.getInstance來獲取對象。
透明的單例模式
實現一個“透明”的單例類,可以是用戶從這個類中創建對象的時候,可以像使用其他普通函數一樣。
var createDiv = ( function(){ var instance; var createDiv = function( html ){ if( instance ){ return instance; } this.html = html; this.init(); return instance = this; }; createDiv.prototype.init = function(){ var div = document.createElement( "div" ); div.innerHTML = this.html; document.body.appendChild( div ); } return createDiv; })(); var a = new createDiv("tom"); var b = new createDiv("sun"); alert( a === b ); //true
createDiv的構造函數實際上負責了兩件事情。第一是創建對象和執行初始化init方法,第二個是保證只有一個對象。有一個缺點,假如我們某天需要利用這個類,在頁面中創建千千萬萬個div,即要這個類從單例類變成一個普通的可產生多個實例的類,那我們就要改寫createDiv構造函數,把控制創建唯一對象的那一段去掉,這樣會給我們帶來不必要的麻煩。
代理類實現單例模式
我們現在通過代理類來解決透明單例模式提到的問題。
通過引入代理類的方式,把負責管理單例的邏輯移到了代理類proxySingDivCreateDiv中,這樣,createDiv就變成了一個普通類,它跟代理類組合起來可以實現單例模式的效果。
var createDiv = function( html ){ this.html = html; this.init(); }; createDiv.prototype.init = function(){ var div = document.createElement( "div" ); div.innerHTML = this.html; document.body.appendChild( div ); }; var proxySingletonCreateDiv = (function(){ var instance; return function( html ){ if(!instance){ instance = new createDiv( html ); } return instance; } })(); var a = new proxySingletonCreateDiv( "tom" ); var b = new proxySingletonCreateDiv( "sun" ); alert( a === b ); //true
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88918.html
摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設計模式。函數內部聲明了一些局部函數和或變量。緊隨函數聲明放置即可立即執行外部函數,并將所得的對象文字費賠給變量。 JavaScript設計模式-第一部分:單例模式、組合模式和外觀模式 設計模式是一些可靠的編程方式,有助于保證代碼更加易于維護、擴展及分離,所有設計模式在創建大型JavaScript應用程序時均不可或缺 單...
摘要:此時我們創建的對象內保存靜態變量通過取值器訪問,最后將這個對象作為一個單例放在全局空間里面作為靜態變量單例對象供他人使用。 單例模式 又被稱為單體模式,是只允許實例化一次的對象類。有時我們也用一個對象來規劃一個命名空間,井井有條的管理對象上面的屬性和方法。 傳統的面向對象語言中單例模式的實現,均是單例對象從類中創建而來,在以類為中心的語言中,這是很常見的做法。如果需要某個對象,就必須先...
摘要:不符合設計模式中的單一職責的概念。引入代理實現單例模式引入代理實現單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現的單例模式都混入了傳統面向對象語言的特點。 聲明:這個系列為閱讀《JavaScript設計模式與開發實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統面向對...
摘要:停更許久,近期計劃更新設計模式系列。單例模式是創建型設計模式的一種。雖然它不是正規的單例模式,但不可否認確實具備類單例模式的特點。適用場景單例模式的特點,意圖解決維護一個全局實例對象。 停更許久,近期計劃更新:設計模式系列。 showImg(https://segmentfault.com/img/bVbt7uw?w=800&h=600); 單例模式:限制類實例化次數只能一次,一個類只...
摘要:觀察構造函數的代碼,該構造函數實際上負責了兩件事情第一是創建對象和執行初始化方法,第二是保證只有一個對象。惰性單例在實際開發中非常有用,是單例模式的重點。 單例模式 單例模式的定義是: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 單例模式是一種常用的模式,有一些對象我們往往只需要一個,比如線程池、全局緩存、瀏覽器的window對象等。例如,當我們點擊登錄按鈕時,頁面會彈出一...
摘要:在面向對象的語言中,比如,等,單例模式通常是定義類時將構造函數設為,保證對象不能在外部被出來,同時給類定義一個靜態的方法,用來獲取或者創建這個唯一的實例。 萬事開頭難,作為正經歷菜鳥賽季的前端player,已經忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...
閱讀 2604·2021-11-02 14:39
閱讀 4321·2021-10-11 10:58
閱讀 1446·2021-09-06 15:12
閱讀 1837·2021-09-01 10:49
閱讀 1326·2019-08-29 18:31
閱讀 1882·2019-08-29 16:10
閱讀 3331·2019-08-28 18:21
閱讀 867·2019-08-26 10:42