標籤:設計模式 抽象原廠模式
抽象原廠模式可以向客戶提供介面,使得用戶端在不必指定產品具體類型的情況下建立多個產品族中的產品對象。
系統的設計
採用抽象原廠模式設計出的系統類別圖如下:
從可以看出,抽象原廠模式涉及到角色:
抽象工廠角色(AbstractFactory):擔任這個角色的是Factory 方法模式的核心,它與應用系統的商業邏輯無關。通常使用Java介面或者抽象Java類實現,而所有的具體工廠類都必須實現這個Java介面或者繼承這個抽象Java類。
具體工廠類(ConcreteFactory)角色:這個角色直接在用戶端的調用下建立產品執行個體。這個角色包含有選擇合適的產品對象的邏輯,而這個邏輯與應用系統的商業邏輯緊密相關的。通常使用具體Java類實現這個角色。
抽象產品(Abstract Product)角色:擔任這個角色的類是Factory 方法模式所建立的對象的父類,或他們共同擁有的介面。通常使用Java介面或者抽象Java類實現這一角色。
具體產品(Concrete Product)角色:抽象原廠模式所建立的任何產品對象都是某一個具體產品類的執行個體。這是用戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。通常使用具體Java類實現這個角色。
工廠角色原始碼public interface Creater { /** * 產品等級A的Factory 方法 * @author 付玉偉 * @time 2015-3-21 下午05:03:14 * @return */ public ProductA factoryA(); /** * 產品等級B的Factory 方法 * @author 付玉偉 * @time 2015-3-21 下午05:03:31 * @return */ public ProductB factoryB();}
具體的工廠角色(一般而言,有多少個產品等級結構,就會在工廠角色中發現多個個Factory 方法,每一個產品等級結構中有多少個具體的產品,就有多少個產品族,也就會在工廠等級結構發現多少個具體的工廠)
public class ConcreteCreator1 implements Creater { public ProductA factoryA() { return new ProductA1(); } public ProductB factoryB() { return new ProductB1(); }}public class ConcreteCreatro2 implements Creater { public ProductA factoryA() { return new ProductA1(); } public ProductB factoryB() { return new ProductB1(); }}public interface ProductA {}public interface ProductB {}public class ProductA1 implements ProductA { public ProductA1(){ }}public class ProductA2 implements ProductA { public ProductA2(){ }}public class ProductB1 implements ProductB { public ProductB1(){ }}public class ProductB2 implements ProductB { public ProductB2(){ }}
用戶端需要的不是工廠,而是具體的產品。在真實的系統中,產品類應當與應用系統的商業邏輯有密切的關係。
在什麼情況下使用抽象原廠模式?
1、一個系統不應單依賴於產品類執行個體如何被建立、組合和表達的細節,這對於所有形態的原廠模式都是重要的。
2、這個系統的產品有多於一個的產品族,而系統中只消費其中某一族的產品
3、同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統設計中體現出來
4、系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於實現
Java設計模式——抽象原廠模式(Abstract factory)