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

資訊專欄INFORMATION COLUMN

JavaScript設(shè)計(jì)模式----單例模式

selfimpr / 1541人閱讀

摘要:不符合設(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í)踐》 ----曾探@著一書(shū)的讀書(shū)筆記

1.單例模式的特點(diǎn)和定義

保證一個(gè)類僅有一個(gè)實(shí)例,并且提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

2.傳統(tǒng)面向?qū)ο笳Z(yǔ)言的單例模式 2.1傳統(tǒng)語(yǔ)言描述的單例模式JavaScript實(shí)現(xiàn)
var Singleton = function(name) {
    this.name = name;
    this.instance = null;
};

Singleton.prototype.getName = function() {
    alert(this.name);
};

Singleton.getInstance = function(name) {
    if (!this.instance) {
        this.instance = new Singleton(name);
    }

    return this.instance;
};

var a = Singleton.getInstance("seven1");
var b = Singleton.getInstance("seven2");

或者使用閉包的形式創(chuàng)建單例模式,同時(shí)符合惰性單例的特性

var Singleton = function(name) {
    this.name = name;
};

Singleton.prototype.getName = function() {
    alert(this.name);
};

//利用閉包的特性創(chuàng)建單例,同時(shí)符合惰性單例的特性
Singleton.getInstance = (function(name) {
    var instance;
    return function(name){
        if (!instance) {
            instance = new Singleton(name);
        }
    }
})();

var a = Singleton.getInstance("seven1");
var b = Singleton.getInstance("seven2");

console.log(a===b);   //true
2.2透明的單例模式:
//反面的單例模式的例子

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("seven1");
var b = new CreateDiv("seven2");

這樣編寫(xiě)單例模式的缺點(diǎn):

為了把instance封裝起來(lái),我們使用了自執(zhí)行的匿名函數(shù)和閉包,并且讓這個(gè)匿名函數(shù)返回真正的Singleton構(gòu)造方法,這增加了一些程序的復(fù)雜度。

CreateDiv的構(gòu)造函數(shù)負(fù)責(zé)了兩件事情。1.創(chuàng)建對(duì)像和執(zhí)行初始化init方法,第二是保證只有一個(gè)對(duì)象。不符合設(shè)計(jì)模式中的單一職責(zé)的概念。

2.3引入代理實(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("seven1");
var b = new ProxySingletonCreateDiv("seven2");

引入代理實(shí)現(xiàn)單例模式的特點(diǎn):

我們負(fù)責(zé)管理單例的邏輯移到了代理類ProxySingletonCreateDiv中。這樣一來(lái),CreateDiv就變成了一個(gè)普通的類,他跟ProxySingletonCreateDiv組合起來(lái)可以達(dá)到單例模式的效果。

3.JavaScript的單例模式對(duì)比

在以上的代碼中實(shí)現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z(yǔ)言的特點(diǎn)。而沒(méi)有利用JavaScript這們語(yǔ)言的特點(diǎn)來(lái)實(shí)現(xiàn)一個(gè)單例模式。

3.1惰性單例的例子

概念描述:

惰性單例指的是在需要的時(shí)候才創(chuàng)建對(duì)象的實(shí)例。惰性單例是單例模式的重點(diǎn)。

var createLoginLayer=(function(){
    var div;
    return function(){
        if(!div){
            div=document.createElement("div");
            //創(chuàng)建一個(gè)登錄框
        }
        return div;
    }
})();

document.getElementById("loginBtn").onclick=function(){
    var loginLayer=createLoginLayer();
    loginLayer.style.display="block";
};

代碼解析:
這里的對(duì)惰性單例的實(shí)現(xiàn)主要是只有單例了網(wǎng)頁(yè)上的登錄按鈕,才會(huì)去創(chuàng)建,登錄框的dom節(jié)點(diǎn),并且只是創(chuàng)建一次。

3.2通用的單例模式例子

根據(jù)3.1的代碼示例,我們的單例對(duì)像,但是并不是通用的,比如我們要?jiǎng)?chuàng)建的不是div而是iframe,那要怎么辦呢?

//獲取單例
var getSingle = function(fn){
    var result;
    return function (){
        return result || (result=fn.apply(this,arguments));
    };
};

//創(chuàng)建div登錄框
var createLoginLayer=function (){
    var div= document.createElement("div");
    div.innerHTML="我是登錄框";
    document.body.appendChild(div);
    return div;
};

//創(chuàng)建iframe的dom節(jié)點(diǎn)
var createIframe=function(){
    //創(chuàng)建irame節(jié)點(diǎn)的代碼
}

var createSingleLoginLayer = getSingle(createLoginLayer);
var createSingleIframe=getSingle(createIframe);

var loginLayer1 = createSingleLoginLayer();
var loginLayer2 = createSingleLoginLayer();

var iframe1=createSingleIframe();
var iframe2=createSingleIframe();

console.log(loginLayer1 === loginLayer2);

通用的單例創(chuàng)建的例子就是通過(guò)封裝一個(gè)getSingle需要實(shí)現(xiàn)單例模式的對(duì)象。而且只是會(huì)只創(chuàng)建一次。因?yàn)槭褂昧?strong>閉包的原因通過(guò)getSingle創(chuàng)建的result會(huì)在內(nèi)存中一直存在不會(huì)銷(xiāo)毀(除非頁(yè)面關(guān)閉,或者手動(dòng)釋放)。

總結(jié):

單例模式是一種簡(jiǎn)單但非常實(shí)用的模式,特別是惰性單例技術(shù),在合適的時(shí)候才創(chuàng)建對(duì)像,并且只創(chuàng)建唯一的一個(gè)。更奇妙的是,創(chuàng)建對(duì)象和管理單例的職責(zé)被分布在兩個(gè)不同的方法中,這兩個(gè)方法組合起來(lái)才具有單例模式的威力。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/86420.html

相關(guān)文章

  • JavaScript設(shè)計(jì)模式-第一部分:單例模式、組合模式和外觀模式

    摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設(shè)計(jì)模式。函數(shù)內(nèi)部聲明了一些局部函數(shù)和或變量。緊隨函數(shù)聲明放置即可立即執(zhí)行外部函數(shù),并將所得的對(duì)象文字費(fèi)賠給變量。 JavaScript設(shè)計(jì)模式-第一部分:?jiǎn)卫J?、組合模式和外觀模式 設(shè)計(jì)模式是一些可靠的編程方式,有助于保證代碼更加易于維護(hù)、擴(kuò)展及分離,所有設(shè)計(jì)模式在創(chuàng)建大型JavaScript應(yīng)用程序時(shí)均不可或缺 單...

    betacat 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式單例模式

    摘要:此時(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ì)象,就必須先...

    zhaot 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式(一):單例模式

    摘要:停更許久,近期計(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è)類只...

    xialong 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐 | 04 - 單例模式

    摘要:觀察構(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ì)彈出一...

    awkj 評(píng)論0 收藏0
  • 再遇設(shè)計(jì)模式JavaScript

    摘要:在面向?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)忘記第一次告訴自己要寫(xiě)一些東西出來(lái)是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開(kāi)始,從看到這篇文章開(kāi)始,打開(kāi)電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...

    Clect 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<