ABSTRACT FACTORY(抽象工廠)—對象創(chuàng)建型模
意圖
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類.
適用性
在以下情況可以使用AbstractFactory模式
?一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)撬即。
?一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)犁柜。
?當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
?當(dāng)你提供一個(gè)產(chǎn)品類庫裳食,而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)或衡。
結(jié)構(gòu)
效果
AbstractFactory模式有下面的一些優(yōu)點(diǎn)和缺點(diǎn):
1)它分離了具體的類。AbstractFactory模式幫助你控制一個(gè)應(yīng)用創(chuàng)建的對象的類宣增。因?yàn)?br>
一個(gè)工廠封裝創(chuàng)建產(chǎn)品對象的責(zé)任和過程玫膀,它將客戶與類的實(shí)現(xiàn)分離〉ⅲ客戶通過它們的抽象接口操縱實(shí)例帖旨。產(chǎn)品的類名也在具體工廠的實(shí)現(xiàn)中被分離;它們不出現(xiàn)在客戶代碼中灵妨。
2)它使得易于交換產(chǎn)品系列一個(gè)具體工廠類在一個(gè)應(yīng)用中僅出現(xiàn)一次—即在它初始化
的時(shí)候解阅。這使得改變一個(gè)應(yīng)用的具體工廠變得很容易。它只需改變具體的工廠即可使用不同的產(chǎn)品配置泌霍,這是因?yàn)橐粋€(gè)抽象工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列货抄,所以整個(gè)產(chǎn)品系列會(huì)立刻改變。在我們的用戶界面的例子中朱转,我們僅需轉(zhuǎn)換到相應(yīng)的工廠對象并重新創(chuàng)建接口蟹地,就可實(shí)現(xiàn)從Motif窗口組件轉(zhuǎn)換為PresentationManager窗口組件。
3)它有利于產(chǎn)品的一致性當(dāng)一個(gè)系列中的產(chǎn)品對象被設(shè)計(jì)成一起工作時(shí)藤为,一個(gè)應(yīng)用一
次只能使用同一個(gè)系列中的對象怪与,這一點(diǎn)很重要。而AbstractFactory很容易實(shí)現(xiàn)這一點(diǎn)缅疟。
4)難以支持新種類的產(chǎn)品難以擴(kuò)展抽象工廠以生產(chǎn)新種類的產(chǎn)品琼梆。這是因?yàn)?br>
AbstractFactory接口確定了可以被創(chuàng)建的產(chǎn)品集合。支持新種類的產(chǎn)品就需要擴(kuò)展該工廠接口窿吩,這將涉及AbstractFactory類及其所有子類的改變茎杂。我們會(huì)在實(shí)現(xiàn)一節(jié)討論這個(gè)問題的一個(gè)解決辦法。
BUILDER(生成器)—對象創(chuàng)建型模式
將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離纫雁,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示煌往。
適用性
在以下情況使用Builder模式
?當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí)。
?當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時(shí)轧邪。
結(jié)構(gòu)
效果
這里是Builder模式的主要效果:
1)它使你可以改變一個(gè)產(chǎn)品的內(nèi)部表示Builder對象提供給導(dǎo)向器一個(gè)構(gòu)造產(chǎn)品的抽象接口刽脖。該接口使得生成器可以隱藏這個(gè)產(chǎn)品的表示和內(nèi)部結(jié)構(gòu)。它同時(shí)也隱藏了該產(chǎn)品是如何裝配的忌愚。因?yàn)楫a(chǎn)品是通過抽象接口構(gòu)造的曲管,你在改變該產(chǎn)品的內(nèi)部表示時(shí)所要做的只是定
義一個(gè)新的生成器。
2)它將構(gòu)造代碼和表示代碼分開Builder模式通過封裝一個(gè)復(fù)雜對象的創(chuàng)建和表示方式
提高了對象的模塊性硕糊≡核客戶不需要知道定義產(chǎn)品內(nèi)部結(jié)構(gòu)的類的所有信息腊徙;這些類是不出現(xiàn)在Builder接口中的。每個(gè)ConcreteBuilder包含了創(chuàng)建和裝配一個(gè)特定產(chǎn)品的所有代碼檬某。這些代碼只需要寫一次撬腾;然后不同的Director可以復(fù)用它以在相同部件集合的基礎(chǔ)上構(gòu)作不同的Product。
3)它使你可對構(gòu)造過程進(jìn)行更精細(xì)的控制Builder模式與一下子就生成產(chǎn)品的創(chuàng)建型模
式不同恢恼,它是在導(dǎo)向者的控制下一步一步構(gòu)造產(chǎn)品的民傻。僅當(dāng)該產(chǎn)品完成時(shí)導(dǎo)向者才從生成器中取回它。因此Builder接口相比其他創(chuàng)建型模式能更好的反映產(chǎn)品的構(gòu)造過程场斑。這使你可以更精細(xì)的控制構(gòu)建過程漓踢,從而能更精細(xì)的控制所得產(chǎn)品的內(nèi)部結(jié)構(gòu)。
FACTORY METHOD(工廠方法)—對象創(chuàng)建型模式
定義一個(gè)用于創(chuàng)建對象的接口漏隐,讓子類決定實(shí)例化哪一個(gè)類彭雾。FactoryMethod使一個(gè)類的實(shí)例化延遲到其子類。
適用性
在下列情況下可以使用FactoryMethod模式:
?當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類的時(shí)候锁保。
?當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象的時(shí)候。
?當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè)半沽,并且你希望將哪一個(gè)幫助子類
是代理者這一信息局部化的時(shí)候爽柒。
結(jié)構(gòu)
效果
工廠方法不再將與特定應(yīng)用有關(guān)的類綁定到你的代碼中。代碼僅處理Product接口者填;因此
它可以與用戶定義的任何ConcreteProduct類一起使用浩村。
工廠方法的一個(gè)潛在缺點(diǎn)在于客戶可能僅僅為了創(chuàng)建一個(gè)特定的ConcreteProduct對象,
就不得不創(chuàng)建Creator的子類占哟。當(dāng)Creator子類不必需時(shí)心墅,客戶現(xiàn)在必然要處理類演化的其他方面;但是當(dāng)客戶無論如何必須創(chuàng)建Creator的子類時(shí)榨乎,創(chuàng)建子類也是可行的怎燥。
下面是FactoryMethod模式的另外兩種效果:
1)為子類提供掛鉤(hook)用工廠方法在一個(gè)類的內(nèi)部創(chuàng)建對象通常比直接創(chuàng)建對象
更靈活。FactoryMethod給子類一個(gè)掛鉤以提供對象的擴(kuò)展版本蜜暑。
2)連接平行的類層次迄今為止铐姚,在我們所考慮的例子中,工廠方法并不往往只是被
Creator調(diào)用肛捍,客戶可以找到一些有用的工廠方法隐绵,尤其在平行類層次的情況下。