
在上文提到的最易懂的設(shè)計模式系列解析:工廠方法模式,發(fā)現(xiàn)工廠方法模式存在一個嚴(yán)重的問題:
一個具體工廠只能創(chuàng)建一類產(chǎn)品而在實際過程中,一個工廠往往需要生產(chǎn)多類產(chǎn)品。為了解決上述的問題,我們又使用了一種新的設(shè)計模式:抽象工廠模式。
在閱讀下文前強(qiáng)烈建議先閱讀 1. 1分鐘全面了解“設(shè)計模式” 2. 最易懂的設(shè)計模式系列解析:簡單工廠模式 3. 最易懂的設(shè)計模式系列解析:工廠方法模式 4. 其他設(shè)計模式介紹 1分鐘全面了解“設(shè)計模式” 單例模式(Singleton) - 最易懂的設(shè)計模式解析 簡單工廠模式(SimpleFactoryPattern)- 最易懂的設(shè)計模式解析 工廠方法模式(Factory Method)- 最易懂的設(shè)計模式解析 抽象工廠模式(Abstract Factory)- 最易懂的設(shè)計模式解析 策略模式(Strategy Pattern)- 最易懂的設(shè)計模式解析 適配器模式(Adapter Pattern)- 最易懂的設(shè)計模式解析 代理模式(PRoxy Pattern)- 最易懂的設(shè)計模式解析 模板方法模式(Template Method) - 最易懂的設(shè)計模式解析 建造者模式(Builder Pattern)- 最易懂的設(shè)計模式解析 外觀模式(Facade Pattern) - 最易懂的設(shè)計模式解析

抽象工廠模式,即Abstract Factory Pattern,提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類;具體的工廠負(fù)責(zé)實現(xiàn)具體的產(chǎn)品實例。
抽象工廠模式與工廠方法模式最大的區(qū)別:抽象工廠中每個工廠可以創(chuàng)建多種類的產(chǎn)品;而工廠方法每個工廠只能創(chuàng)建一類
允許使用抽象的接口來創(chuàng)建一組相關(guān)產(chǎn)品,而不需要知道或關(guān)心實際生產(chǎn)出的具體產(chǎn)品是什么,這樣就可以從具體產(chǎn)品中被解耦。
每個工廠只能創(chuàng)建一類產(chǎn)品
即工廠方法模式的缺點

| 組成(角色) | 關(guān)系 | 作用 | 
|---|---|---|
| 抽象產(chǎn)品族(AbstractProduct) | 抽象產(chǎn)品的父類 | 描述抽象產(chǎn)品的公共接口 | 
| 抽象產(chǎn)品(Product) | 具體產(chǎn)品的父類 | 描述具體產(chǎn)品的公共接口 | 
| 具體產(chǎn)品(Concrete Product) | 抽象產(chǎn)品的子類;工廠類創(chuàng)建的目標(biāo)類 | 描述生產(chǎn)的具體產(chǎn)品 | 
| 抽象工廠(Creator) | 具體工廠的父類 | 描述具體工廠的公共接口 | 
| 具體工廠(Concrete Creator) | 抽象工廠的子類;被外界調(diào)用 | 描述具體工廠;實現(xiàn)FactoryMethod工廠方法創(chuàng)建產(chǎn)品的實例 | 
如何理解抽象產(chǎn)品族、抽象產(chǎn)品和具體產(chǎn)品的區(qū)別呢?請看下圖 
步驟1: 創(chuàng)建抽象工廠類,定義具體工廠的公共接口; 步驟2: 創(chuàng)建抽象產(chǎn)品族類 ,定義抽象產(chǎn)品的公共接口; 步驟3: 創(chuàng)建抽象產(chǎn)品類 (繼承抽象產(chǎn)品族類),定義具體產(chǎn)品的公共接口; 步驟4: 創(chuàng)建具體產(chǎn)品類(繼承抽象產(chǎn)品類) & 定義生產(chǎn)的具體產(chǎn)品; 步驟5:創(chuàng)建具體工廠類(繼承抽象工廠類),定義創(chuàng)建對應(yīng)具體產(chǎn)品實例的方法; 步驟6:客戶端通過實例化具體的工廠類,并調(diào)用其創(chuàng)建不同目標(biāo)產(chǎn)品的方法創(chuàng)建不同具體產(chǎn)品類的實例
接下來我用一個實例來對抽象工廠模式進(jìn)行更深一步的介紹。
步驟1: 創(chuàng)建抽象工廠類,定義具體工廠的公共接口
abstract class Factory{ public abstract Product ManufactureContainer(); public abstract Product ManufactureMould();}步驟2: 創(chuàng)建抽象產(chǎn)品族類 ,定義具體產(chǎn)品的公共接口;
abstract class AbstractProduct{ public abstract void Show();}步驟3: 創(chuàng)建抽象產(chǎn)品類 ,定義具體產(chǎn)品的公共接口;
//容器產(chǎn)品抽象類abstract class ContainerProduct extends AbstractProduct{ @Override public abstract void Show();}//模具產(chǎn)品抽象類abstract class MouldProduct extends AbstractProduct{ @Override public abstract void Show();}步驟4: 創(chuàng)建具體產(chǎn)品類(繼承抽象產(chǎn)品類), 定義生產(chǎn)的具體產(chǎn)品;
//容器產(chǎn)品A類class ContainerProductA extends ContainerProduct{ @Override public void Show() { System.out.println("生產(chǎn)出了容器產(chǎn)品A"); }}//容器產(chǎn)品B類class ContainerProductB extends ContainerProduct{ @Override public void Show() { System.out.println("生產(chǎn)出了容器產(chǎn)品B"); }}//模具產(chǎn)品A類class MouldProductA extends MouldProduct{ @Override public void Show() { System.out.println("生產(chǎn)出了模具產(chǎn)品A"); }}//模具產(chǎn)品B類class MouldProductB extends MouldProduct{ @Override public void Show() { System.out.println("生產(chǎn)出了模具產(chǎn)品B"); }}步驟5:創(chuàng)建具體工廠類(繼承抽象工廠類),定義創(chuàng)建對應(yīng)具體產(chǎn)品實例的方法;
//A廠 - 生產(chǎn)模具+容器產(chǎn)品class FactoryA extends Factory{ @Override public Product ManufactureContainer() { return new ContainerProductA(); } @Override public Product ManufactureMould() { return new MouldProductA(); }}//B廠 - 生產(chǎn)模具+容器產(chǎn)品class FactoryB extends Factory{ @Override public Product ManufactureContainer() { return new ContainerProductB(); } @Override public Product ManufactureMould() { return new MouldProductB(); }}步驟6:客戶端通過實例化具體的工廠類,并調(diào)用其創(chuàng)建不同目標(biāo)產(chǎn)品的方法創(chuàng)建不同具體產(chǎn)品類的實例
//生產(chǎn)工作流程public class AbstractFactoryPattern { public static void main(String[] args){ FactoryA mFactoryA = new FactoryA(); FactoryB mFactoryB = new FactoryB(); //A廠當(dāng)?shù)乜蛻粜枰萜鳟a(chǎn)品A mFactoryA.ManufactureContainer().Show(); //A廠當(dāng)?shù)乜蛻粜枰>弋a(chǎn)品A mFactoryA.ManufactureMould().Show(); //B廠當(dāng)?shù)乜蛻粜枰萜鳟a(chǎn)品B mFactoryB.ManufactureContainer().Show(); //B廠當(dāng)?shù)乜蛻粜枰>弋a(chǎn)品B mFactoryB.ManufactureMould().Show(); }}結(jié)果:生產(chǎn)出了容器產(chǎn)品A生產(chǎn)出了容器產(chǎn)品B生產(chǎn)出了模具產(chǎn)品A生產(chǎn)出了模具產(chǎn)品B降低耦合 抽象工廠模式將具體產(chǎn)品的創(chuàng)建延遲到具體工廠的子類中,這樣將對象的創(chuàng)建封裝起來,可以減少客戶端與具體產(chǎn)品類之間的依賴,從而使系統(tǒng)耦合度低,這樣更有利于后期的維護(hù)和擴(kuò)展;
更符合開-閉原則 新增一種產(chǎn)品類時,只需要增加相應(yīng)的具體產(chǎn)品類和相應(yīng)的工廠子類即可
簡單工廠模式需要修改工廠類的判斷邏輯
符合單一職責(zé)原則 每個具體工廠類只負(fù)責(zé)創(chuàng)建對應(yīng)的產(chǎn)品
簡單工廠中的工廠類存在復(fù)雜的switch邏輯判斷
不使用靜態(tài)工廠方法,可以形成基于繼承的等級結(jié)構(gòu)。
簡單工廠模式的工廠類使用靜態(tài)工廠方法
對于新的產(chǎn)品族符合開-閉原則;對于新的產(chǎn)品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。
在了解了優(yōu)缺點后,我總結(jié)了工廠方法模式的應(yīng)用場景:
一個系統(tǒng)不要求依賴產(chǎn)品類實例如何被創(chuàng)建、組合和表達(dá)的表達(dá),這點也是所有工廠模式應(yīng)用的前提。這個系統(tǒng)有多個系列產(chǎn)品,而系統(tǒng)中只消費其中某一系列產(chǎn)品系統(tǒng)要求提供一個產(chǎn)品類的庫,所有產(chǎn)品以同樣的接口出現(xiàn),客戶端不需要依賴具體實現(xiàn)。本文主要對抽象工廠模式進(jìn)行了全面介紹,接下來將介紹其他設(shè)計模式,有興趣可以繼續(xù)關(guān)注Carson_Ho的安卓開發(fā)筆記!!!!
相關(guān)文章閱讀 單例模式(Singleton) - 最易懂的設(shè)計模式解析 簡單工廠模式(SimpleFactoryPattern)- 最易懂的設(shè)計模式解析 工廠方法模式(Factory Method)- 最易懂的設(shè)計模式解析 抽象工廠模式(Abstract Factory)- 最易懂的設(shè)計模式解析 策略模式(Strategy Pattern)- 最易懂的設(shè)計模式解析 適配器模式(Adapter Pattern)- 最易懂的設(shè)計模式解析 代理模式(Proxy Pattern)- 最易懂的設(shè)計模式解析 模板方法模式(Template Method) - 最易懂的設(shè)計模式解析 建造者模式(Builder Pattern)- 最易懂的設(shè)計模式解析 外觀模式(Facade Pattern) - 最易懂的設(shè)計模式解析
新聞熱點
疑難解答