設(shè)計(jì)模式第三周

對(duì)象性能模式

十四。單例模式

關(guān)鍵點(diǎn):只存在一個(gè)實(shí)例(以保證邏輯上的正確性)

創(chuàng)建型的設(shè)計(jì)模式繞過new是為了避免new帶來的耦合

這個(gè)繞過new解決的是性能問題


問題:以上寫法單線程是安全的魂莫;而線程則不安全

解決:加鎖(但鎖的代價(jià)過高)


Singleton*Singleton::getInstance(){

?Lock lock;

if(m_instance == nullptr{

?? m_instance= new Singleton();

}

return m_instance;

}


問題:對(duì)于都是讀操作的線程是浪費(fèi)的(即讀操作是安全的)(高并發(fā)環(huán)境下會(huì)有許多讀操作)

解決:雙檢查鎖(鎖前鎖后都要檢查)


Singleton* Singleton::getInstance(){

?? if(m_instance==nullptr){

???????? Lock lock;

????? if(m_instance == nullptr{

????????? m_instance = new???Singleton();

???? ?}

?? }

}


鎖前檢查:避免代價(jià)過高

鎖后檢查:避免不正確

問題(2000年左右再java領(lǐng)域發(fā)現(xiàn)):會(huì)出現(xiàn)reorder的情況導(dǎo)致雙檢查鎖的失效

reorder:實(shí)際上代碼到了指令層次;指令和假設(shè)不一樣遍愿;

m_instance = new Singleton();這一行有幾個(gè)假設(shè);如果拆分成三個(gè)步驟的話:1.分配內(nèi)存2.調(diào)用構(gòu)造器3.把指針得到的返回值給m_instance

以上是假想順序:實(shí)際上有可能reorder(即先分配內(nèi)存耘斩,再把內(nèi)存地址給m_instance最后再調(diào)用構(gòu)造器)沼填;

c++加了一個(gè)關(guān)鍵字(volatile)以解決上述問題;

模式定義:保證一個(gè)類僅有一個(gè)實(shí)例括授,并提供一個(gè)該實(shí)例的全局訪問點(diǎn)

要點(diǎn)總結(jié):

1.實(shí)例構(gòu)造器可以設(shè)置為protected以允許子類派生

2.一般不要支持拷貝構(gòu)造函數(shù)和clone接口坞笙,因?yàn)檫@有可能導(dǎo)致多個(gè)對(duì)象實(shí)例,與初衷違背

3.雙檢查鎖的正確實(shí)現(xiàn)可以實(shí)現(xiàn)多線程環(huán)境下的安全Singleton

注:nullptr荚虚?薛夜??


行為變化模式

組件的構(gòu)件過程中版述,組件行為的變化經(jīng)常導(dǎo)致組建本身劇烈的變化梯澜。“行為變化模式”將組件的行為和組件本身進(jìn)行解耦渴析,從而支持組件行為的變化腊徙,實(shí)現(xiàn)兩者之間的送耦合

非虛和靜態(tài)函數(shù):地址直接以編譯時(shí)綁定方式

虛函數(shù):運(yùn)行時(shí)綁定

二一简十。命令模式

動(dòng)機(jī)1.行為請(qǐng)求者與行為是閑著通常呈現(xiàn)一種緊耦合。但在某些場(chǎng)合——比如需要對(duì)香味進(jìn)行“記錄撬腾、撤銷/重、事物”等處理恢恼,這種無法抵御變化的緊耦合是不合適的民傻。2.這種情況下,如何將“行為請(qǐng)求者”與行為實(shí)現(xiàn)者“解耦场斑?將一組行為抽象為對(duì)象漓踢,可以實(shí)現(xiàn)二者之間的松耦合

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漏隐,隨后出現(xiàn)的幾起案子喧半,更是在濱河造成了極大的恐慌,老刑警劉巖青责,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挺据,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脖隶,警方通過查閱死者的電腦和手機(jī)扁耐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來产阱,“玉大人婉称,你說我怎么就攤上這事」沟牛” “怎么了王暗?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庄敛。 經(jīng)常有香客問我俗壹,道長,這世上最難降的妖魔是什么铐姚? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任策肝,我火速辦了婚禮,結(jié)果婚禮上隐绵,老公的妹妹穿的比我還像新娘之众。我一直安慰自己,他們只是感情好依许,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布棺禾。 她就那樣靜靜地躺著,像睡著了一般峭跳。 火紅的嫁衣襯著肌膚如雪膘婶。 梳的紋絲不亂的頭發(fā)上缺前,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音悬襟,去河邊找鬼衅码。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脊岳,可吹牛的內(nèi)容都是我干的逝段。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼割捅,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奶躯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亿驾,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嘹黔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后莫瞬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儡蔓,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年乏悄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浙值。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡檩小,死狀恐怖开呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情规求,我是刑警寧澤筐付,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏早芭。R本人自食惡果不足惜蓬戚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一芦倒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸印衔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奸焙。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間与帆,已是汗流浹背了赌。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玄糟,地道東北人勿她。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像茶凳,于是被迫代替她去往敵國和親嫂拴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容