3.6 創(chuàng)建型模式的討論

用一個系統(tǒng)創(chuàng)建的那些對象的類對系統(tǒng)進行參數(shù)化有兩種常用方法。一種是生成創(chuàng)建對
象的類的子類狡相;這對應(yīng)于使用 Factory Method(3 . 3)模式。這種方法的主要缺點是,僅為了
改變產(chǎn)品類镣屹,就可能需要創(chuàng)建一個新的子類。這樣的改變可能是級聯(lián)的( cascade)价涝。例如女蜈,如果產(chǎn)品的創(chuàng)建者本身是由一個工廠方法創(chuàng)建的,那么你也必須重定義它的創(chuàng)建者。

另一種對系統(tǒng)進行參數(shù)化的方法更多的依賴于對象復(fù)合:定義一個對象負責明確產(chǎn)品對象的類伪窖,并將它作為該系統(tǒng)的參數(shù)逸寓。這是 Abstract Factory(3 . 1)、Builder(3 . 2)和Prototype(3 . 4)模式的關(guān)鍵特征覆山。所有這三個模式都涉及到創(chuàng)建一個新的負責創(chuàng)建產(chǎn)品對象的“工廠對象”竹伸。Abstract Factory由這個工廠對象產(chǎn)生多個類的對象。 Builder由這個工廠對象使用一個相對復(fù)雜的協(xié)議簇宽,逐步創(chuàng)建一個復(fù)雜產(chǎn)品勋篓。Prototype由該工廠對象通過拷貝原型對象來創(chuàng)建產(chǎn)品對象。在這種情況下魏割,因為原型負責返回產(chǎn)品對象譬嚣,所以工廠對象和原型是同一個對象。

考慮在Prototype模式中描述的繪圖編輯器框架见妒」氯伲可以有多種方法通過產(chǎn)品類來參數(shù)化GraphicTool:

  • 使用Factory Method模式,將為選擇板中的每個Graphic的子類創(chuàng)建一個GraphicTool的子
    類须揣。GraphicTool將有一個NewGraphic操作盐股,每個GraphicTool的子類都會重定義它。
  • 使用Abstract Factory模式耻卡,將有一個GraphicsFactory類層次對應(yīng)于每個Graphic的子類疯汁。
    在這種情況每個工廠僅創(chuàng)建一個產(chǎn)品: CircleFactory將創(chuàng)建Circle,LineFactory將創(chuàng)建L i n e卵酪,等等幌蚊。GraphicTool將以創(chuàng)建合適種類Graphic的工廠作為參數(shù)。
  • 使用Prototype模式溃卡,每個Graphic的子類將實現(xiàn)Clone操作溢豆,并且GraphicTool將以它所創(chuàng)
    建的Graphic的原型作為參數(shù)。

究竟哪一種模式最好取決于諸多因素瘸羡。在我們的繪圖編輯器框架中漩仙,第一眼看來,F(xiàn)actory Method模式使用是最簡單的犹赖。它易于定義一個新的GraphicTool的子類队他,并且僅當選擇板被定義了的時候,GraphicTool的實例才被創(chuàng)建峻村。它的主要缺點在于GraphicTool子類數(shù)目的激增麸折,并且它們都沒有做很多事情。

Abstract Factory并沒有很大的改進粘昨,因為它需要一個同樣龐大的 GraphicsFactory類層次垢啼。只有當早已存在一個GraphicsFactory類層次時窜锯,Abstract Factory才比Factory Method更好一點— 或是因為編譯器自動提供(像在SmallTalk或是Objective C中)或是因為系統(tǒng)的其他部分需\要這個GraphicsFactory類層次。

總的來說膊夹,Prototype模式對繪圖編輯器框架可能是最好的衬浑,因為它僅需要為每個Graphics類實現(xiàn)一個Clone操作捌浩。這就減少了類的數(shù)目放刨,并且 Clone可以用于其他目的而不僅僅是純粹的實例化(例如,一個D u p l i c a t e菜單操作)尸饺。

Factory Method使一個設(shè)計可以定制且只略微有一些復(fù)雜进统。其他設(shè)計模式需要新的類,而
Factory Method只需要一個新的操作浪听。人們通常將 Factory Method作為一種標準的創(chuàng)建對象的方法螟碎。但是當被實例化的類根本不發(fā)生變化或當實例化出現(xiàn)在子類可以很容易重定義的操作中(比如在初始化操作中)時,這就并不必要了迹栓。

使用Abstract Factory掉分、Prototype或Builder的設(shè)計甚至比使用Factory Method的那些設(shè)計更靈活,但它們也更加復(fù)雜克伊。通常酥郭,設(shè)計以使用 Factory Method開始,并且當設(shè)計者發(fā)現(xiàn)需要更大的靈活性時愿吹,設(shè)計便會向其他創(chuàng)建型模式演化不从。當你在設(shè)計標準之間進行權(quán)衡的時候,了解多個模式可以給你提供更多的選擇余地犁跪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椿息,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坷衍,更是在濱河造成了極大的恐慌寝优,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枫耳,死亡現(xiàn)場離奇詭異乏矾,居然都是意外死亡,警方通過查閱死者的電腦和手機嘉涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門妻熊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仑最,你說我怎么就攤上這事扔役。” “怎么了警医?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵亿胸,是天一觀的道長坯钦。 經(jīng)常有香客問我,道長侈玄,這世上最難降的妖魔是什么婉刀? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮序仙,結(jié)果婚禮上突颊,老公的妹妹穿的比我還像新娘。我一直安慰自己潘悼,他們只是感情好律秃,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著治唤,像睡著了一般棒动。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宾添,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天船惨,我揣著相機與錄音,去河邊找鬼缕陕。 笑死粱锐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的榄檬。 我是一名探鬼主播卜范,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹿榜!你這毒婦竟也來了海雪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤舱殿,失蹤者是張志新(化名)和其女友劉穎奥裸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沪袭,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡湾宙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冈绊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侠鳄。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖死宣,靈堂內(nèi)的尸體忽然破棺而出伟恶,到底是詐尸還是另有隱情,我是刑警寧澤毅该,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布博秫,位于F島的核電站潦牛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挡育。R本人自食惡果不足惜巴碗,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望即寒。 院中可真熱鬧橡淆,春花似錦、人聲如沸蒿叠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽市咽。三九已至,卻和暖如春抵蚊,著一層夾襖步出監(jiān)牢的瞬間施绎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工贞绳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谷醉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓冈闭,卻偏偏與公主長得像俱尼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萎攒,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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