細(xì)品 javascript 設(shè)計(jì)模式(單利模式)

我盡量用最少的文字,最少的篇幅末荐,講明白設(shè)計(jì)模式的方方面面。
文章連接

理解單利模式

確保只有一個(gè)實(shí)例播急,并提供全局訪問(wèn)蓖捶。
例如 redux 中的 store狠裹,線程池剪撬,全局緩存椿息,瀏覽器 window 對(duì)象等法希。

上代碼:通用的惰性單利模式

let getSingle = function(fn) {
    let result = 'initial_single';
    return function() {
        if (result === 'initial_single') {
            result = fn.apply(this, arguments);
        }
        return result;
    }
}

// 測(cè)試 -----
let Tree = function() {
    console.log('something')
}
let getSingleTree = getSingle(Tree)
getSingleTree() // 第一次調(diào)用時(shí)輸出:console.log('something')
getSingleTree() //
getSingleTree() //

// 調(diào)用三次只會(huì)輸出一次

單利模式的演進(jìn)過(guò)程

1. 普通單利

用變量來(lái)標(biāo)記某個(gè)對(duì)象是否被創(chuàng)建過(guò)枷餐,如果是直接返回之前創(chuàng)建的變量

上代碼:

let Person = function(name) {
    this.name = name
}
Person.prototype.getName = function() {
    console.log(this.name)
}
Person.getSingle = (function() {
    let instance = null;
    return function(name) {
        if (!instance) {
            instance = new Person(name)
        }
        return instance
    }
})();

2. 透明單利

有一個(gè)類(lèi),不論你 new 多少次苫亦。它都給你返回第一次 new 的那個(gè)實(shí)例毛肋。這就是透明的單利模式,所謂透明屋剑,就是你不能看出它是單利村生。

上代碼:

let Person = (function() {
    let instance;
    Person = function(name) {
        if (instance) {
            return instance;
        }
        this.name = name;
        return instance = this;
    }
    return Person;
})();
let p = new Person('C#')
let a = new Person('java')
console.log(p === a) // true

3. 用代理實(shí)現(xiàn)單利

之前的單利實(shí)現(xiàn)都有一個(gè)共同的問(wèn)題:類(lèi)和單利的代碼都交織在一起。這樣有違反“單一職能”原則饼丘。

代理趁桃,就是把類(lèi)應(yīng)該做的事,和單利應(yīng)該做的事情分開(kāi)
上代碼:

// 類(lèi)
var Person = function(name) {
    this.name = name;
}
// 代理
let ProxySinglePerson = (function() {
    let result;
    return function(name) {
        if (result) {
            return result
        }
        result = new Person(name)
        return result
    }
})();

let p = new ProxySinglePerson('C#')
let a = new ProxySinglePerson('java')
console.log(p === a) // true

5. 惰性單利

意思是肄鸽,需要用到的時(shí)候才創(chuàng)建卫病。這是單利模式的應(yīng)用中非常重要的一點(diǎn)。
其實(shí)之前的代碼中也已經(jīng)包含了惰性單利典徘,看下面代碼蟀苛。重點(diǎn)關(guān)注“惰性”。

上代碼:

// 類(lèi)
var Person = function(name) {
    this.name = name;
}
Person.getSingle = (function() {
    let instance;
    return function(name) {
        if (!instance) {
            instance = new Person(name);
        }
        return instance;
    }
})();
var p = Person.getSingle('C#')
var a = Person.getSingle('java')
console.log(p === a) // true

6. 通用的惰性單利

一勞永逸逮诲,這次咱們完成一個(gè)通用的惰性單利帜平。也就是文章開(kāi)頭的那段代碼
let getSingle = function(fn) {
    let result = 'initial_single';
    return function() {
        if (result === 'initial_single') {
            result = fn.apply(this, arguments);
        }
        return result;
    }
}

小結(jié)

本章學(xué)習(xí)了單利模式的演進(jìn)過(guò)程,還提到了代理模式和單一職責(zé)原則梅鹦。之后的文章里我會(huì)對(duì)他們做詳細(xì)的講解裆甩。

在 getSingle 函數(shù)中,也提到了閉包和高階函數(shù)的概念齐唆。單利模式是一種非常實(shí)用的模式嗤栓,特別是惰性單利技術(shù),在合適的時(shí)候才創(chuàng)建對(duì)象,并且全局唯一茉帅。更奇妙的是創(chuàng)建對(duì)象和管理單利的職責(zé)被分布在兩個(gè)不同的方法中叨叙,這兩個(gè)方法組合起來(lái)才有單利模式的威力。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堪澎,一起剝皮案震驚了整個(gè)濱河市擂错,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌樱蛤,老刑警劉巖马昙,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刹悴,居然都是意外死亡行楞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)土匀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)子房,“玉大人,你說(shuō)我怎么就攤上這事就轧≈ず迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵妒御,是天一觀的道長(zhǎng)解愤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乎莉,這世上最難降的妖魔是什么送讲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮惋啃,結(jié)果婚禮上哼鬓,老公的妹妹穿的比我還像新娘。我一直安慰自己边灭,他們只是感情好异希,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绒瘦,像睡著了一般称簿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惰帽,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天憨降,我揣著相機(jī)與錄音,去河邊找鬼善茎。 笑死券册,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垂涯。 我是一名探鬼主播烁焙,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耕赘!你這毒婦竟也來(lái)了骄蝇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤操骡,失蹤者是張志新(化名)和其女友劉穎九火,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體册招,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岔激,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虑鼎。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖键痛,靈堂內(nèi)的尸體忽然破棺而出炫彩,到底是詐尸還是另有隱情,我是刑警寧澤絮短,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布江兢,位于F島的核電站,受9級(jí)特大地震影響丁频,放射性物質(zhì)發(fā)生泄漏杉允。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一席里、第九天 我趴在偏房一處隱蔽的房頂上張望夺颤。 院中可真熱鬧,春花似錦胁勺、人聲如沸世澜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寥裂。三九已至,卻和暖如春案疲,著一層夾襖步出監(jiān)牢的瞬間封恰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工褐啡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诺舔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像低飒,于是被迫代替她去往敵國(guó)和親许昨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355