摘要:代碼示例代碼中創(chuàng)建了一個單例的包裝器,使用的示例代碼如下因?yàn)槭菃卫虼耍覀兛梢园褜ο蟮姆椒ㄖ苯臃旁谏希挥梅旁诘膶ο笊稀N覀兛梢允褂靡粋€單例池來保存不同構(gòu)造器的單例,用來標(biāo)識是否為該構(gòu)造器生成單例,并作為下標(biāo)索引獲取該單例。
1. 簡介
Singleton(單例)模式的理解要從兩個方面
它限制了類的實(shí)例化次數(shù)只能為一次,即在該實(shí)例不存在的情況下,可以通過一個方法創(chuàng)建對象實(shí)例,如果實(shí)例已經(jīng)存在,則返回該對象的引用。
它不同于靜態(tài)類(對象),單例可以推遲初始化,這一點(diǎn)很重要,因?yàn)榭梢酝七t初始化,就意味著不用過早地為單例分配內(nèi)存資源,而是可以當(dāng)需要使用時,才對其進(jìn)行初始化,分配對應(yīng)的內(nèi)存空間。
單例的存在,在一些時候并不是好事,可能它的出現(xiàn)時因?yàn)橄到y(tǒng)中的模塊要么是系統(tǒng)緊密耦合,要么是其邏輯過分分散。
2. 代碼示例var singleton = (function () { var instance; return { getInstance : function (factory){ var args = Array.prototype.slice.call(arguments, 1); if(!instance){ instance = {}; factory.apply(instance, args); } return instance; } } })();
代碼中創(chuàng)建了一個單例的包裝器,使用的示例代碼如下
function Person(name, age){ this.name = name; this.age = age; this.sayName = function () { console.log(this.name); } } var p1 = singleton.getInstance(Person, "zhang", 25); var p2 = singleton.getInstance(Person); console.log(p1 == p2); // true console.log(p2.sayName()); // "zhang"
因?yàn)槭菃卫虼耍覀兛梢园褜ο蟮姆椒ㄖ苯臃旁趖his上,而不用放在Person的prototype對象上。但是這段代碼還有不足,那就是只能產(chǎn)生一個構(gòu)造器的單例,我們可以來對其進(jìn)行改進(jìn)。
var singleton = (function () { var instances = [], guid = 0; return { getInstance : function (factory){ var args = Array.prototype.slice.call(arguments, 1); if(typeof factory._guid == "undefined"){ instances[guid] = {}; factory.apply(instances[guid], args); factory._guid = guid++; } return instances[factory._guid]; } } })();
我們可以使用一個單例池(instances)來保存不同構(gòu)造器的單例,用_guid來標(biāo)識是否為該構(gòu)造器生成單例,并作為下標(biāo)索引獲取該單例。使用示例:
function Person(name, age){ this.name = name; this.age = age; this.sayName = function () { console.log(this.name); } } var p1 = singleton.getInstance(Person, "zhang", 25); var p2 = singleton.getInstance(Person); console.log(p1 == p2); // true console.log(p2.sayName()); // "zhang" function Car(brand){ this.brand = brand; this.sayBrand = function () { console.log(this.brand); } } var c1 = singleton.getInstance(Car, "benchi"); var c2 = singleton.getInstance(Car); console.log(c1 == c2); // true console.log(c2.sayBrand()); // "benchi"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91082.html
摘要:簡單工廠模式的實(shí)質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類。中的就是簡單工廠模式的體現(xiàn),根據(jù)傳入一個唯一的標(biāo)識來獲得對象,但是否是在傳入?yún)?shù)后創(chuàng)建還是傳入?yún)?shù)前創(chuàng)建這個要根據(jù)具體情況來定。中的就是典型的工廠方法模式。 showImg(https://segmentfault.com/img/bVbwbd9?w=640&h=492); 一. 簡單工廠又叫做靜態(tài)工廠方法(...
摘要:在面向?qū)ο蟮恼Z言中,比如,等,單例模式通常是定義類時將構(gòu)造函數(shù)設(shè)為,保證對象不能在外部被出來,同時給類定義一個靜態(tài)的方法,用來獲取或者創(chuàng)建這個唯一的實(shí)例。 萬事開頭難,作為正經(jīng)歷菜鳥賽季的前端player,已經(jīng)忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...
摘要:不符合設(shè)計(jì)模式中的單一職責(zé)的概念。引入代理實(shí)現(xiàn)單例模式引入代理實(shí)現(xiàn)單例模式的特點(diǎn)我們負(fù)責(zé)管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實(shí)現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z言的特點(diǎn)。 聲明:這個系列為閱讀《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點(diǎn)和定義 保證一個類僅有一個實(shí)例,并且提供一個訪問它的全局訪問點(diǎn)。 2.傳統(tǒng)面向?qū)?..
摘要:簡單工廠模式的實(shí)質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類。中的就是簡單工廠模式的體現(xiàn),根據(jù)傳入一個唯一的標(biāo)識來獲得對象,但是否是在傳入?yún)?shù)后創(chuàng)建還是傳入?yún)?shù)前創(chuàng)建這個要根據(jù)具體情況來定。 設(shè)計(jì)模式作為工作學(xué)習(xí)中的枕邊書,卻時常處于勤說不用的尷尬境地,也不是我們時常忘記,只是一直沒有記憶。 Spring作為業(yè)界的經(jīng)典框架,無論是在架構(gòu)設(shè)計(jì)方面,還是在代碼編寫方面,都堪...
閱讀 1144·2021-11-25 09:43
閱讀 1578·2021-10-25 09:47
閱讀 2475·2019-08-30 13:46
閱讀 760·2019-08-29 13:45
閱讀 1289·2019-08-26 13:29
閱讀 2996·2019-08-23 15:30
閱讀 1111·2019-08-23 14:17
閱讀 1333·2019-08-23 13:43