国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【學(xué)習(xí)設(shè)計(jì)模式】通用的單例包裝器

ormsf / 1495人閱讀

摘要:代碼示例代碼中創(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

相關(guān)文章

  • 詳解Spring中的9種設(shè)計(jì)模式「記得收藏」

    摘要:簡單工廠模式的實(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)工廠方法(...

    Dean 評論0 收藏0
  • 再遇設(shè)計(jì)模式之JavaScript篇

    摘要:在面向?qū)ο蟮恼Z言中,比如,等,單例模式通常是定義類時將構(gòu)造函數(shù)設(shè)為,保證對象不能在外部被出來,同時給類定義一個靜態(tài)的方法,用來獲取或者創(chuàng)建這個唯一的實(shí)例。 萬事開頭難,作為正經(jīng)歷菜鳥賽季的前端player,已經(jīng)忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...

    Clect 評論0 收藏0
  • JavaScript設(shè)計(jì)模式----單例模式

    摘要:不符合設(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ū)?..

    selfimpr 評論0 收藏0
  • 這些Spring中的設(shè)計(jì)模式,你都知道嗎?

    摘要:簡單工廠模式的實(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ì)方面,還是在代碼編寫方面,都堪...

    LeviDing 評論0 收藏0

發(fā)表評論

0條評論

ormsf

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<