Aliases: Kit
** Intent**
? ―Provide an interface for creating families of related ordependent objects without specifying their concreteclasses.‖ (提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類 – 客戶端不必指定產(chǎn)品的具體類型俊啼,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象)
** Motivation**
? 為保證視感風(fēng)格標(biāo)準(zhǔn)間的可移植性剂陡,應(yīng)用不應(yīng)該為一個(gè)特定的視感外觀硬編碼它的窗口組件。在整個(gè)應(yīng)用中實(shí)例化特定視感風(fēng)格的窗口組件類將使得以后很難改變視感風(fēng)格咐蝇。
對(duì)產(chǎn)品族涯鲁,如果采用工廠方法模式,則需要使用多個(gè)獨(dú)立的工廠等級(jí)結(jié)構(gòu)來(lái)對(duì)付這多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。是否可以使用同一個(gè)工廠等級(jí)結(jié)構(gòu)來(lái)對(duì)付這些相同或者及其相似的產(chǎn)品等級(jí)結(jié)構(gòu)呢抹腿?
1)什么情況下使用抽象工廠模式岛请? [GOF]
? 一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)警绩,這對(duì)于 所有形態(tài)的工廠模式都很重要崇败;
? 該系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品肩祥;(原 始用意)
? 同屬于同一產(chǎn)品族的產(chǎn)品是在一起使用的后室,這一約束條件必須在系統(tǒng)的設(shè)計(jì) 中體現(xiàn)出來(lái);
? 系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù)混狠,所有的產(chǎn)品以同樣的接口
? 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建岸霹、組合和表示時(shí)。
? 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來(lái)配臵時(shí)将饺。
? 當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)贡避。
? 當(dāng)你提供一個(gè)產(chǎn)品類庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)予弧。
1)優(yōu)點(diǎn)
? 分離了具體的類刮吧。抽象工廠模式中一個(gè)工廠封裝創(chuàng)建產(chǎn)品對(duì)象的責(zé)任和過(guò)程。它將客戶和類的實(shí)現(xiàn)分離桌肴,客戶通過(guò)抽象接口操縱實(shí)例皇筛,產(chǎn)品的類名也在具體工廠的實(shí)現(xiàn)中被分離,它們不出現(xiàn)在客戶代碼中坠七。
? 易于交換產(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ì)立刻改變拳魁。
? 有利于產(chǎn)品的一致性惶桐。當(dāng)一個(gè)系列的產(chǎn)品對(duì)象被設(shè)計(jì)成一起工作時(shí),一個(gè)應(yīng)用一次只能使用同一個(gè)系列中的對(duì)象
2)缺點(diǎn)
? 難以增加新產(chǎn)品的等級(jí)結(jié)構(gòu):需要修改所有的工廠角色潘懊,沒(méi)有很好支持"開(kāi)放-封閉"原則姚糊。