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

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

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

考慮在Prototype模式中描述的繪圖編輯器框架??梢杂卸喾N方法通過產(chǎn)品類來參數(shù)化GraphicTool:

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

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

Abstract Factory并沒有很大的改進(jìn),因?yàn)樗枰粋€(gè)同樣龐大的 GraphicsFactory類層次。只有當(dāng)早已存在一個(gè)GraphicsFactory類層次時(shí),Abstract Factory才比Factory Method更好一點(diǎn)— 或是因?yàn)榫幾g器自動提供(像在SmallTalk或是Objective C中)或是因?yàn)橄到y(tǒng)的其他部分需\要這個(gè)GraphicsFactory類層次。

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容