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

資訊專欄INFORMATION COLUMN

Javascript設(shè)計(jì)模式(三)單例模式

孫吉亮 / 3120人閱讀

摘要:?jiǎn)卫J降亩x是保證一個(gè)類只有僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。并且按照單一職責(zé)原則類實(shí)現(xiàn)功能類管理單例管理單例模式,達(dá)到可組合的的效果創(chuàng)建普通類引入代理類惰性單例模式分離創(chuàng)建實(shí)例對(duì)象的職責(zé)與管理單例的職責(zé)。

單例模式的定義是:保證一個(gè)類只有僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

單例模式是一種常用的模式,有些對(duì)象我們往往只需要一個(gè),比如線程池,全局緩存,window對(duì)象。

簡(jiǎn)單單例模式

要實(shí)現(xiàn)一個(gè)單例模式并不復(fù)雜,無(wú)非是用一個(gè)變量來(lái)標(biāo)志當(dāng)前是否已經(jīng)為某個(gè)類創(chuàng)建過(guò)對(duì)象,如果是,則在下一次獲取該類的時(shí)候,直接返回之前創(chuàng)建的對(duì)象。

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("sven1")
var b = Singleton.getInstance("sven2")  

alert(a===b) // true

通過(guò)Singleton.getInstance來(lái)獲取Singleton類的唯一對(duì)象,這種方式相對(duì)簡(jiǎn)單,但有問(wèn)題,使用者并不知道這是一個(gè)單例類

用代理實(shí)現(xiàn)的單例模式

我們現(xiàn)在的目標(biāo)是實(shí)現(xiàn)一個(gè)透明的單例類,用戶從這個(gè)類中獲取對(duì)象的時(shí)候,可以像使用其他普通類一樣。并且按照單一職責(zé)原則,createDiv類實(shí)現(xiàn)功能,proxySingletonCreateDiv類管理單例管理單例模式,達(dá)到可組合的的效果

// 創(chuàng)建普通類
var CreateDiv = function(html){
    this.html = html
    this.init()
}

CreateDiv.prototype.init = function() {
    var div = document.createComment("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("sven1")
var b = new proxySingletonCreateDiv("sven2")  

alert(a===b) // true
惰性單例模式

分離創(chuàng)建實(shí)例對(duì)象的職責(zé)與管理單例的職責(zé)。下面用創(chuàng)建一個(gè)登陸框舉例

// 管理單例
var getSingle = function(fn) {
    var result
    return function() {
        return result || (result= fn.apply(this, arguments))
    }
}
var createLoginLayer = function() {
    var div = document.createElement("div")
    div.innerHTML = "我是登陸浮窗"
    div.style.display = "none"
    document.body.appendChild(div)
    return div
}

var createSingleLoginLayer = getSingle(createLoginLayer)

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

單例模式是一種簡(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/99161.html

相關(guān)文章

  • javascript單例、代理、狀態(tài)設(shè)計(jì)模式

    摘要:代理模式代理模式為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制對(duì)于它訪問(wèn)。這種代理就叫虛擬代理。保護(hù)代理用于對(duì)象應(yīng)該有不同訪問(wèn)權(quán)限情況。寫時(shí)復(fù)制代理時(shí)虛擬代理的一種變體。 一、創(chuàng)建型設(shè)計(jì)模式(三大類設(shè)計(jì)模式) 創(chuàng)建型設(shè)計(jì)模式 --創(chuàng)建說(shuō)明該類別里面的設(shè)計(jì)模式就是用來(lái)創(chuàng)建對(duì)象的,也就是在不同的場(chǎng)景下我們應(yīng)該選用什么樣的方式來(lái)創(chuàng)建對(duì)象。 1. 單例模式 ==單例模式(Singleton)==:...

    0xE7A38A 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式-第一部分:單例模式、組合模式和外觀模式

    摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設(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í)均不可或缺 單...

    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ì)模式----單例模式

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

    selfimpr 評(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

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

0條評(píng)論

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