C++設(shè)計模式(三) GeekBand

“對象性能”模式

面向?qū)ο蠛芎玫亟鉀Q了“抽象”的問題,但是不可避免地要付出一定的代價部翘。對于通常情況來講硝训,面向?qū)ο蟮某杀敬蠖伎梢院雎裕承┣闆r新思,面向?qū)ο笏鶐淼某杀颈仨氈斏魈幚怼?br> 典型模式

  • Singleton
  • Flyweight

Singleton 單件模式

動機
  • 在軟件系統(tǒng)中窖梁,經(jīng)常有這樣一些特殊的類,必須保證它們在系統(tǒng)中只存在一個實例夹囚,才能確保它們邏輯正確性和良好的效率纵刘。
  • 如何繞過常規(guī)的構(gòu)造器,提供一種機制來保證一個類只有一個示例荸哟。
  • 這應(yīng)該是類設(shè)計者的責任假哎,而不是使用者的責任。
模式定義

保證一個類僅有一個實例鞍历,并提供一個該實例的全局訪問點舵抹。

結(jié)構(gòu)
Singleton
要點總結(jié)
  • Singleton模式中的實例構(gòu)造器可以設(shè)置為protected以允許子類派生。
  • Singleton模式一般不要支持拷貝構(gòu)造函數(shù)和Clone接口劣砍,因為這有可能導致多個對象實例惧蛹,與Singleton模式的初衷違背。
  • 注意多線程環(huán)境下實現(xiàn)安全的Singleton,注意對雙檢查鎖的正確實現(xiàn)赊淑。

Flyweight 享元模式

動機
  • 在軟件系統(tǒng)采用純粹對象方案的問題在于大量細粒度的對象會很快充斥在系統(tǒng)中爵政,從而帶來很高的運行時代價——主要指內(nèi)存需求方面的代價。
  • 如何在避免大量細粒度對象問題的同時陶缺,讓外部客戶程序仍然能夠透明地使用面向?qū)ο蟮姆绞絹磉M行操作?
模式定義

運用共享技術(shù)有效地支持大量細粒度的對象洁灵。

結(jié)構(gòu)
Flyweight
要點總結(jié)
  • 面向?qū)ο蠛芎玫亟鉀Q了抽象性的問題饱岸,但是作為一個運行在機器中的程序?qū)嶓w,我們需要考慮對象的代價問題徽千。Flyweight主要解決面向?qū)ο蟮拇鷥r問題苫费,一般不觸及面向?qū)ο蟮某橄笮詥栴}。
  • Flyweight采用對象共享分做法來降低系統(tǒng)中對象的個數(shù)双抽,從而降低細粒度對象給系統(tǒng)帶來的內(nèi)存壓力百框。具體實現(xiàn)方面,要注意對象狀態(tài)的處理牍汹。
  • 對象的數(shù)量太大從而導致對象內(nèi)存開銷加大——什么樣的數(shù)量才算大铐维?這需要我們仔細的根據(jù)具體應(yīng)用情況進行評估,而不能憑空臆斷慎菲。

“狀態(tài)變化”模式

在組件構(gòu)建過程中嫁蛇,某些對象的狀態(tài)經(jīng)常面臨變化,如何對這些變化進行有效的管理露该?同時又維持高層模塊的穩(wěn)定睬棚?“狀態(tài)變化”模式為這一問題提供了一種解決方案。
典型模式

  • State
  • Memento

State 狀態(tài)模式

動機
  • 在軟件構(gòu)建過程中解幼,某些對象的狀態(tài)如果改變抑党,其行為也會隨之而發(fā)生變化,比如文檔處于只讀狀態(tài)撵摆,其支持的行為和讀寫狀態(tài)支持的行為就可能完全不同底靠。
  • 如何在運行時根據(jù)對象的狀態(tài)來透明地更改對象行為?而不會為對象操作和狀態(tài)轉(zhuǎn)化之間引入緊耦合台汇?
模式定義

允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為苛骨。從而使對象看起來似乎修改了其行為。

結(jié)構(gòu)
State
要點總結(jié)
  • State模式將所有與一個特定狀態(tài)相關(guān)的行為都放入一個State的子類對象中苟呐,在對象狀態(tài)切換時切換相應(yīng)的對象痒芝;但同時維持State的接口,這樣實現(xiàn)了具體操作與狀態(tài)轉(zhuǎn)換之間的解耦牵素。
  • 為不同的狀態(tài)引入不同的對象使得狀態(tài)轉(zhuǎn)換變得更加明確严衬,而且可以保證不會出現(xiàn)狀態(tài)不一致的情況,因為轉(zhuǎn)換是原子性的——即要么徹底轉(zhuǎn)換過來笆呆,要么不轉(zhuǎn)換请琳。
  • 如果State對象沒有實例變量粱挡,那么各個上下文可以共享同一個State對象,從而節(jié)省對象開銷俄精。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末询筏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子竖慧,更是在濱河造成了極大的恐慌嫌套,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圾旨,死亡現(xiàn)場離奇詭異踱讨,居然都是意外死亡,警方通過查閱死者的電腦和手機砍的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門痹筛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廓鞠,你說我怎么就攤上這事帚稠。” “怎么了诫惭?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵翁锡,是天一觀的道長。 經(jīng)常有香客問我夕土,道長馆衔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任怨绣,我火速辦了婚禮角溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篮撑。我一直安慰自己减细,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布赢笨。 她就那樣靜靜地躺著未蝌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧妒。 梳的紋絲不亂的頭發(fā)上萧吠,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音桐筏,去河邊找鬼纸型。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的狰腌。 我是一名探鬼主播除破,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琼腔!你這毒婦竟也來了瑰枫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤丹莲,失蹤者是張志新(化名)和其女友劉穎躁垛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圾笨,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年逊谋,在試婚紗的時候發(fā)現(xiàn)自己被綠了擂达。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡胶滋,死狀恐怖板鬓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情究恤,我是刑警寧澤俭令,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站部宿,受9級特大地震影響抄腔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜理张,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一赫蛇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雾叭,春花似錦悟耘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至移迫,卻和暖如春旺嬉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背起意。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工鹰服, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓悲酷,卻偏偏與公主長得像套菜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子设易,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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