摘要:的構(gòu)造函數(shù)實(shí)際上負(fù)責(zé)了兩件事情。有一個(gè)缺點(diǎn),假如我們某天需要利用這個(gè)類,在頁(yè)面中創(chuàng)建千千萬(wàn)萬(wàn)個(gè),即要這個(gè)類從單例類變成一個(gè)普通的可產(chǎn)生多個(gè)實(shí)例的類,那我們就要改寫構(gòu)造函數(shù),把控制創(chuàng)建唯一對(duì)象的那一段去掉,這樣會(huì)給我們帶來(lái)不必要的麻煩。
定義:?jiǎn)卫J奖WC一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。
單例模式是一種常用的模式,有一些對(duì)象我們往往只需要一個(gè),比如線程池、全局緩存、瀏覽器中的window對(duì)象等。當(dāng)我們創(chuàng)建的對(duì)象只會(huì)被創(chuàng)建一次時(shí),這個(gè)時(shí)候就適合用單例模式來(lái)創(chuàng)建,因?yàn)楫?dāng)我們點(diǎn)擊登錄按鈕的時(shí)候,頁(yè)面會(huì)出現(xiàn)一個(gè)懸浮窗,而這個(gè)懸浮窗是唯一的,無(wú)論單擊多少次登錄按鈕,這個(gè)只會(huì)被創(chuàng)建一次。
實(shí)現(xiàn)單例模式
實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的單例模式,用一個(gè)變量來(lái)標(biāo)志當(dāng)前是否已經(jīng)為某個(gè)類創(chuàng)建過(guò)對(duì)象,如果是,則在下一次獲取該類的實(shí)例時(shí),直接返回之前創(chuàng)建的對(duì)象。代碼如下: 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
我們通過(guò)Singleton.getInstance來(lái)獲取Singleton類的唯一對(duì)象,簡(jiǎn)單,但有一個(gè)問(wèn)題,就是增加了這個(gè)類的“不透明性”,Singleton類的使用者必須知道這是一個(gè)單例類,跟以往通過(guò)new XXX的方式來(lái)獲取對(duì)象不同,這里偏要使用Singleton.getInstance來(lái)獲取對(duì)象。
透明的單例模式
實(shí)現(xiàn)一個(gè)“透明”的單例類,可以是用戶從這個(gè)類中創(chuàng)建對(duì)象的時(shí)候,可以像使用其他普通函數(shù)一樣。
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的構(gòu)造函數(shù)實(shí)際上負(fù)責(zé)了兩件事情。第一是創(chuàng)建對(duì)象和執(zhí)行初始化init方法,第二個(gè)是保證只有一個(gè)對(duì)象。有一個(gè)缺點(diǎn),假如我們某天需要利用這個(gè)類,在頁(yè)面中創(chuàng)建千千萬(wàn)萬(wàn)個(gè)div,即要這個(gè)類從單例類變成一個(gè)普通的可產(chǎn)生多個(gè)實(shí)例的類,那我們就要改寫createDiv構(gòu)造函數(shù),把控制創(chuàng)建唯一對(duì)象的那一段去掉,這樣會(huì)給我們帶來(lái)不必要的麻煩。
代理類實(shí)現(xiàn)單例模式
我們現(xiàn)在通過(guò)代理類來(lái)解決透明單例模式提到的問(wèn)題。
通過(guò)引入代理類的方式,把負(fù)責(zé)管理單例的邏輯移到了代理類proxySingDivCreateDiv中,這樣,createDiv就變成了一個(gè)普通類,它跟代理類組合起來(lái)可以實(shí)現(xiàn)單例模式的效果。
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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/88918.html
摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設(shè)計(jì)模式。函數(shù)內(nèi)部聲明了一些局部函數(shù)和或變量。緊隨函數(shù)聲明放置即可立即執(zhí)行外部函數(shù),并將所得的對(duì)象文字費(fèi)賠給變量。 JavaScript設(shè)計(jì)模式-第一部分:?jiǎn)卫J健⒔M合模式和外觀模式 設(shè)計(jì)模式是一些可靠的編程方式,有助于保證代碼更加易于維護(hù)、擴(kuò)展及分離,所有設(shè)計(jì)模式在創(chuàng)建大型JavaScript應(yīng)用程序時(shí)均不可或缺 單...
摘要:此時(shí)我們創(chuàng)建的對(duì)象內(nèi)保存靜態(tài)變量通過(guò)取值器訪問(wèn),最后將這個(gè)對(duì)象作為一個(gè)單例放在全局空間里面作為靜態(tài)變量單例對(duì)象供他人使用。 單例模式 又被稱為單體模式,是只允許實(shí)例化一次的對(duì)象類。有時(shí)我們也用一個(gè)對(duì)象來(lái)規(guī)劃一個(gè)命名空間,井井有條的管理對(duì)象上面的屬性和方法。 傳統(tǒng)的面向?qū)ο笳Z(yǔ)言中單例模式的實(shí)現(xiàn),均是單例對(duì)象從類中創(chuàng)建而來(lái),在以類為中心的語(yǔ)言中,這是很常見(jiàn)的做法。如果需要某個(gè)對(duì)象,就必須先...
摘要:不符合設(shè)計(jì)模式中的單一職責(zé)的概念。引入代理實(shí)現(xiàn)單例模式引入代理實(shí)現(xiàn)單例模式的特點(diǎn)我們負(fù)責(zé)管理單例的邏輯移到了代理類中。的單例模式對(duì)比在以上的代碼中實(shí)現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z(yǔ)言的特點(diǎn)。 聲明:這個(gè)系列為閱讀《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點(diǎn)和定義 保證一個(gè)類僅有一個(gè)實(shí)例,并且提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 2.傳統(tǒng)面向?qū)?..
摘要:停更許久,近期計(jì)劃更新設(shè)計(jì)模式系列。單例模式是創(chuàng)建型設(shè)計(jì)模式的一種。雖然它不是正規(guī)的單例模式,但不可否認(rèn)確實(shí)具備類單例模式的特點(diǎn)。適用場(chǎng)景單例模式的特點(diǎn),意圖解決維護(hù)一個(gè)全局實(shí)例對(duì)象。 停更許久,近期計(jì)劃更新:設(shè)計(jì)模式系列。 showImg(https://segmentfault.com/img/bVbt7uw?w=800&h=600); 單例模式:限制類實(shí)例化次數(shù)只能一次,一個(gè)類只...
摘要:觀察構(gòu)造函數(shù)的代碼,該構(gòu)造函數(shù)實(shí)際上負(fù)責(zé)了兩件事情第一是創(chuàng)建對(duì)象和執(zhí)行初始化方法,第二是保證只有一個(gè)對(duì)象。惰性單例在實(shí)際開(kāi)發(fā)中非常有用,是單例模式的重點(diǎn)。 單例模式 單例模式的定義是: 保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 單例模式是一種常用的模式,有一些對(duì)象我們往往只需要一個(gè),比如線程池、全局緩存、瀏覽器的window對(duì)象等。例如,當(dāng)我們點(diǎn)擊登錄按鈕時(shí),頁(yè)面會(huì)彈出一...
摘要:在面向?qū)ο蟮恼Z(yǔ)言中,比如,等,單例模式通常是定義類時(shí)將構(gòu)造函數(shù)設(shè)為,保證對(duì)象不能在外部被出來(lái),同時(shí)給類定義一個(gè)靜態(tài)的方法,用來(lái)獲取或者創(chuàng)建這個(gè)唯一的實(shí)例。 萬(wàn)事開(kāi)頭難,作為正經(jīng)歷菜鳥(niǎo)賽季的前端player,已經(jīng)忘記第一次告訴自己要寫一些東西出來(lái)是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開(kāi)始,從看到這篇文章開(kāi)始,打開(kāi)電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...
閱讀 2615·2021-11-02 14:39
閱讀 4345·2021-10-11 10:58
閱讀 1474·2021-09-06 15:12
閱讀 1855·2021-09-01 10:49
閱讀 1340·2019-08-29 18:31
閱讀 1891·2019-08-29 16:10
閱讀 3350·2019-08-28 18:21
閱讀 881·2019-08-26 10:42