用一個系統(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)衡的時候,了解多個模式可以給你提供更多的選擇余地犁跪。