“對象性能”模式
面向?qū)ο蠛芎玫亟鉀Q了“抽象”的問題,但是不可避免地要付出一定的代價部翘。對于通常情況來講硝训,面向?qū)ο蟮某杀敬蠖伎梢院雎裕承┣闆r新思,面向?qū)ο笏鶐淼某杀颈仨氈斏魈幚怼?br> 典型模式
- Singleton
- Flyweight
Singleton 單件模式
動機
- 在軟件系統(tǒng)中窖梁,經(jīng)常有這樣一些特殊的類,必須保證它們在系統(tǒng)中只存在一個實例夹囚,才能確保它們邏輯正確性和良好的效率纵刘。
- 如何繞過常規(guī)的構(gòu)造器,提供一種機制來保證一個類只有一個示例荸哟。
- 這應(yīng)該是類設(shè)計者的責任假哎,而不是使用者的責任。
模式定義
保證一個類僅有一個實例鞍历,并提供一個該實例的全局訪問點舵抹。
結(jié)構(gòu)
要點總結(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)
要點總結(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)
要點總結(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é)省對象開銷俄精。