国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

抽象工廠模式(Abstract Factory)- 最易懂的設計模式解析

2019-11-09 17:51:30
字體:
來源:轉載
供稿:網友


前言

在上文提到的最易懂的設計模式系列解析:工廠方法模式,發現工廠方法模式存在一個嚴重的問題:

一個具體工廠只能創建一類產品

而在實際過程中,一個工廠往往需要生產多類產品。為了解決上述的問題,我們又使用了一種新的設計模式:抽象工廠模式。

在閱讀下文前強烈建議先閱讀 1. 1分鐘全面了解“設計模式” 2. 最易懂的設計模式系列解析:簡單工廠模式 3. 最易懂的設計模式系列解析:工廠方法模式 4. 其他設計模式介紹 1分鐘全面了解“設計模式” 單例模式(Singleton) - 最易懂的設計模式解析 簡單工廠模式(SimpleFactoryPattern)- 最易懂的設計模式解析 工廠方法模式(Factory Method)- 最易懂的設計模式解析 抽象工廠模式(Abstract Factory)- 最易懂的設計模式解析 策略模式(Strategy Pattern)- 最易懂的設計模式解析 適配器模式(Adapter Pattern)- 最易懂的設計模式解析 代理模式(PRoxy Pattern)- 最易懂的設計模式解析 模板方法模式(Template Method) - 最易懂的設計模式解析 建造者模式(Builder Pattern)- 最易懂的設計模式解析 外觀模式(Facade Pattern) - 最易懂的設計模式解析


目錄

抽象工廠模式.jpg


1. 介紹

1.1 定義

抽象工廠模式,即Abstract Factory Pattern,提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類;具體的工廠負責實現具體的產品實例。

抽象工廠模式與工廠方法模式最大的區別:抽象工廠中每個工廠可以創建多種類的產品;而工廠方法每個工廠只能創建一類

1.2 主要作用

允許使用抽象的接口來創建一組相關產品,而不需要知道或關心實際生產出的具體產品是什么,這樣就可以從具體產品中被解耦。

1.3 解決的問題

每個工廠只能創建一類產品

工廠方法模式的缺點


2. 模式原理

2.1 UML類圖

UML類圖

2.2 模式組成

組成(角色) 關系 作用
抽象產品族(AbstractProduct) 抽象產品的父類 描述抽象產品的公共接口
抽象產品(Product) 具體產品的父類 描述具體產品的公共接口
具體產品(Concrete Product) 抽象產品的子類;工廠類創建的目標類 描述生產的具體產品
抽象工廠(Creator) 具體工廠的父類 描述具體工廠的公共接口
具體工廠(Concrete Creator) 抽象工廠的子類;被外界調用 描述具體工廠;實現FactoryMethod工廠方法創建產品的實例

如何理解抽象產品族、抽象產品和具體產品的區別呢?請看下圖 概念區別.jpg

2.3 使用步驟

步驟1: 創建抽象工廠類,定義具體工廠的公共接口; 步驟2: 創建抽象產品族類 ,定義抽象產品的公共接口; 步驟3: 創建抽象產品類 (繼承抽象產品族類),定義具體產品的公共接口; 步驟4: 創建具體產品類(繼承抽象產品類) & 定義生產的具體產品; 步驟5:創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法; 步驟6:客戶端通過實例化具體的工廠類,并調用其創建不同目標產品的方法創建不同具體產品類的實例


3. 實例講解

接下來我用一個實例來對抽象工廠模式進行更深一步的介紹。

3.1 實例概況

背景:小成有兩間塑料加工廠(A廠僅生產容器類產品;B廠僅生產模具類產品);隨著客戶需求的變化,A廠所在地的客戶需要也模具類產品,B廠所在地的客戶也需要容器類產品;沖突:沒有資源(資金+租位)在當地分別開設多一家注塑分廠解決方案:在原有的兩家塑料廠里增設生產需求的功能,即A廠能生產容器+模具產品;B廠間能生產模具+容器產品。 即抽象工廠模式

3.2 使用步驟

步驟1: 創建抽象工廠類,定義具體工廠的公共接口

abstract class Factory{ public abstract Product ManufactureContainer(); public abstract Product ManufactureMould();}

步驟2: 創建抽象產品族類 ,定義具體產品的公共接口;

abstract class AbstractProduct{ public abstract void Show();}

步驟3: 創建抽象產品類 ,定義具體產品的公共接口;

//容器產品抽象類abstract class ContainerProduct extends AbstractProduct{ @Override public abstract void Show();}//模具產品抽象類abstract class MouldProduct extends AbstractProduct{ @Override public abstract void Show();}

步驟4: 創建具體產品類(繼承抽象產品類), 定義生產的具體產品;

//容器產品A類class ContainerProductA extends ContainerProduct{ @Override public void Show() { System.out.println("生產出了容器產品A"); }}//容器產品B類class ContainerProductB extends ContainerProduct{ @Override public void Show() { System.out.println("生產出了容器產品B"); }}//模具產品A類class MouldProductA extends MouldProduct{ @Override public void Show() { System.out.println("生產出了模具產品A"); }}//模具產品B類class MouldProductB extends MouldProduct{ @Override public void Show() { System.out.println("生產出了模具產品B"); }}

步驟5:創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法;

//A廠 - 生產模具+容器產品class FactoryA extends Factory{ @Override public Product ManufactureContainer() { return new ContainerProductA(); } @Override public Product ManufactureMould() { return new MouldProductA(); }}//B廠 - 生產模具+容器產品class FactoryB extends Factory{ @Override public Product ManufactureContainer() { return new ContainerProductB(); } @Override public Product ManufactureMould() { return new MouldProductB(); }}

步驟6:客戶端通過實例化具體的工廠類,并調用其創建不同目標產品的方法創建不同具體產品類的實例

//生產工作流程public class AbstractFactoryPattern { public static void main(String[] args){ FactoryA mFactoryA = new FactoryA(); FactoryB mFactoryB = new FactoryB(); //A廠當地客戶需要容器產品A mFactoryA.ManufactureContainer().Show(); //A廠當地客戶需要模具產品A mFactoryA.ManufactureMould().Show(); //B廠當地客戶需要容器產品B mFactoryB.ManufactureContainer().Show(); //B廠當地客戶需要模具產品B mFactoryB.ManufactureMould().Show(); }}結果:生產出了容器產品A生產出了容器產品B生產出了模具產品A生產出了模具產品B

4. 優點

降低耦合 抽象工廠模式將具體產品的創建延遲到具體工廠的子類中,這樣將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利于后期的維護和擴展;

更符合開-閉原則 新增一種產品類時,只需要增加相應的具體產品類和相應的工廠子類即可

簡單工廠模式需要修改工廠類的判斷邏輯

符合單一職責原則 每個具體工廠類只負責創建對應的產品

簡單工廠中的工廠類存在復雜的switch邏輯判斷

不使用靜態工廠方法,可以形成基于繼承的等級結構。

簡單工廠模式的工廠類使用靜態工廠方法


5. 缺點

抽象工廠模式很難支持新種類產品的變化。 這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。

對于新的產品族符合開-閉原則;對于新的產品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。


6. 應用場景

在了解了優缺點后,我總結了工廠方法模式的應用場景:

一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。這個系統有多個系列產品,而系統中只消費其中某一系列產品系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。

7. 總結

本文主要對抽象工廠模式進行了全面介紹,接下來將介紹其他設計模式,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!!!


請點贊!因為你的鼓勵是我寫作的最大動力!

相關文章閱讀 單例模式(Singleton) - 最易懂的設計模式解析 簡單工廠模式(SimpleFactoryPattern)- 最易懂的設計模式解析 工廠方法模式(Factory Method)- 最易懂的設計模式解析 抽象工廠模式(Abstract Factory)- 最易懂的設計模式解析 策略模式(Strategy Pattern)- 最易懂的設計模式解析 適配器模式(Adapter Pattern)- 最易懂的設計模式解析 代理模式(Proxy Pattern)- 最易懂的設計模式解析 模板方法模式(Template Method) - 最易懂的設計模式解析 建造者模式(Builder Pattern)- 最易懂的設計模式解析 外觀模式(Facade Pattern) - 最易懂的設計模式解析



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 衡东县| 商水县| 五大连池市| 互助| 西畴县| 陕西省| 河源市| 古交市| 天柱县| 姜堰市| 平泉县| 化隆| 陵水| 巴楚县| 米林县| 客服| 都兰县| 思茅市| 英吉沙县| 西华县| 天祝| 石首市| 永昌县| 湖南省| 咸阳市| 客服| 扎兰屯市| 永寿县| 贵德县| 应用必备| 巨野县| 津市市| 淄博市| 武威市| 墨江| 龙里县| 鄂托克旗| 丁青县| 泉州市| 泾源县| 基隆市|