06 抽象工廠模式(Abstract Factory Pattern)
阿新 • • 發佈:2018-11-05
隔了兩三天,今天在複習兩個設計模式。
描述性文字
上節通過奶茶店的例子引入了簡單工廠模式與工廠方法模式, 本節我們來繼續通過這個例子引出抽象工廠模式!
程式碼示例
package abstractFactoryPattern; import java.util.Random; /** * 抽象工廠模式測試例程 * @Package abstractFactoryPattern * @Title: AbstractFactoryPattern.java * @Company: $ * @author BurgessLee * @date 2018年10月15日-下午3:38:08 * @Description: $ */ public class AbstractFactoryPattern { public static void main(String[] args) { //初始化兩個小弟 MakeFood makeFood1 = new FirstXiaoDi(); MakeFood makeFood2 = new SecondXiaoDi(); for(int i = 0; i < 4; i++){ System.out.println("訂單配餐======================"); Drink drink = buyDrink() == 0 ? makeFood1.createMakeDrink() : makeFood2.createMakeDrink(); Snack snack = buySnack() == 0 ? makeFood1.createMakeSnack() : makeFood2.createMakeSnack(); drink.drink(); snack.snack(); } } private static int buyDrink(){ return new Random().nextInt(2); } private static int buySnack(){ return new Random().nextInt(2); } } abstract class Drink{ public abstract void drink(); } abstract class Snack{ public abstract void snack(); } class MilkTea extends Drink{ @Override public void drink() { System.out.println("一杯奶茶"); } } class Juice extends Drink{ @Override public void drink() { System.out.println("一杯果汁"); } } class HandGab extends Snack{ @Override public void snack() { System.out.println("一個手抓餅"); } } class FishBoll extends Snack{ @Override public void snack() { System.out.println("一碗魚蛋"); } } abstract class MakeFood{ abstract Drink createMakeDrink(); abstract Snack createMakeSnack(); } class FirstXiaoDi extends MakeFood{ @Override Drink createMakeDrink() { return new MilkTea(); } @Override Snack createMakeSnack() { return new HandGab(); } } class SecondXiaoDi extends MakeFood{ @Override Drink createMakeDrink() { return new Juice(); } @Override Snack createMakeSnack() { return new FishBoll(); } }
執行結果如下:
訂單配餐======================
一杯果汁
一個手抓餅
訂單配餐======================
一杯果汁
一碗魚蛋
訂單配餐======================
一杯果汁
一個手抓餅
訂單配餐======================
一杯果汁
一碗魚蛋
以上就是抽象工廠模式的測試例程了。
兩個名詞(產品等級結構與產品族)
產品等級結構(繼承):
產品的繼承結構,比如這裡的抽象類是Drink(飲料),子類有 奶茶,果汁,然後抽象飲料與具體飲料構成了一個產品等級結構,抽象飲料是父類,具體飲料是其子類。
產品族
同一工廠生產的,位於不同產品等級結構的一組產品,比如這裡 的奶茶和果汁屬於飲料結構的一組產品,而手抓餅和魚蛋則屬於小吃結構的一組產品。
UML類圖
如圖所示,抽象工廠模式就是由四個角色組成:
抽象工廠:宣告一組用於建立產品族的方法,每個方法對應一種產品;
具體工廠:實現抽象工廠建立產品的方法,生成具體產品;
抽象產品
具體產品:抽象產品的具體化,實現抽象產品的相關方法;
使用場景與優缺點
使用場景
建立的物件有多個相互關聯或依賴的產品族
優點
1.隔離具體類的生成,客戶端無需知道怎麼被建立,介面與實現分離
2.增加新的產品族很方便,無須修改已有系統,符合”開閉原則”
缺點
1.類檔案增加
2.擴充套件新的產品等級結構麻煩,需要修改抽象工廠,實現抽象工廠的具體工廠類都要更改!