23種設計模式(三)抽象工廠模式
阿新 • • 發佈:2021-11-23
簡要概括23種設計模式之抽象工廠模式
三、抽象工廠模式
前面介紹的工廠方法模式中考慮的是一類產品的生產,如汽車廠商生產汽車,手機廠商生產手機。但是在生活中手機廠商不一定只生產手機,例如華為還生產路由器和電腦。很顯然工廠模式是解決不了這一類問題的。
在這裡可以引入產品族和產品等級的概念。正如下圖,海爾 和 TCL 兩個廠商,它們同時都能生產電視機和空調,在這裡同一個廠商生產的系列就是一個產品族,而同種產品就是產品等級。工廠模式只能解決產品等級上的問題,而產品族則是由抽象工廠模式來解決。
3.1 抽象工廠模式的特點
抽象工廠模式除了擁有工廠模式的特點以外,還擁有:
-
可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。
-
當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組。
-
抽象工廠增強了程式的可擴充套件性,當增加一個新的產品族時,不需要修改原始碼,滿足開閉原則。
缺點:
- 當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度。
3.2 抽象工廠模式的實現
抽象工廠模式的主要角色如下。
-
抽象工廠(Abstract Factory):提供了建立產品的介面,它包含多個建立產品的方法 newProduct(),可以建立多個不同等級的產品。
-
具體工廠(Concrete Factory):主要是實現抽象工廠中的多個抽象方法,完成具體產品的建立。
-
抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品。
-
具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面,由具體工廠來建立,它同具體工廠之間是多對一的關係。
請看下面的例項,我們用小米和華為的例子來實現抽象工廠模式
/** * 抽象的產品工廠 * * @author kimariyb */ public interface ProductFactory { /** * 生產手機 * @return 生產的手機型號 */ PhoneProduct phoneProduct(); /** * 生產路由器 * @return 生產的路由器型號 */ RouterProduct routerProduct(); } /** * 手機產品介面 * * @author kimariyb */ public interface PhoneProduct { void start(); void close(); void call(); } /** * 路由器介面 * * @author kimariyb */ public interface RouterProduct { void start(); void close(); void sentWeb(); } /** * 小米手機 * * @author kimariyb */ public class XiaomiPhone implements PhoneProduct{ @Override public void start() { System.out.println("小米手機開機"); } @Override public void close() { System.out.println("小米手機關機"); } @Override public void call() { System.out.println("小米手機打電話"); } } /** * 華為手機 * * @author kimariyb */ public class HuaweiPhone implements PhoneProduct{ @Override public void start() { System.out.println("華為手機開機"); } @Override public void close() { System.out.println("華為手機關機"); } @Override public void call() { System.out.println("華為手機打電話"); } } /** * 小米路由器 * * @author kimariyb */ public class XiaomiRouter implements RouterProduct{ @Override public void start() { System.out.println("小米路由器開機"); } @Override public void close() { System.out.println("小米路由器關機"); } @Override public void sentWeb() { System.out.println("小米路由器傳送網路"); } } /** * 華為路由器 * * @author kimariyb */ public class HuaweiRouter implements RouterProduct{ @Override public void start() { System.out.println("華為路由器開機"); } @Override public void close() { System.out.println("華為路由器關機"); } @Override public void sentWeb() { System.out.println("華為路由器傳送網路"); } } /** * 小米工廠 * @author kimariyb */ public class XiaomiFactory implements ProductFactory{ @Override public PhoneProduct phoneProduct() { return new XiaomiPhone(); } @Override public RouterProduct routerProduct() { return new XiaomiRouter(); } } /** * 華為工廠 * * @author kimariyb */ public class HuaweiFactory implements ProductFactory{ @Override public PhoneProduct phoneProduct() { return new HuaweiPhone(); } @Override public RouterProduct routerProduct() { return new HuaweiRouter(); } }
簡單的分析改例項,小米和華為都能生產手機和路由器,很顯然這涉及到了產品族,需要使用抽象工廠模式來實現。