Java 深入理解創建型設計模式之抽象工廠模式
1.什麼是抽象工廠模式?
- 抽象工廠模式: 定義瞭一個interface用於創建相關或有依賴關系的對象簇,而無需指明具體的類。
- 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。
- 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步的抽象)。
- 將工廠抽象成兩層,AbsFactory(抽象工廠))和具體實現的工廠子類。程序員可以根據創建對象類型使用對應的工廠子類。這樣將單個的簡單工廠類變成瞭工廠簇,更利於代碼的維護和擴展。
我們仍然以上一篇文章的案例為主,畫出抽象工廠模式下的類圖。
2.案例代碼
首先仍然是Pizza種類相關的幾個類。
package com.szh.factory.abstractfactory.pizza; /** * 聲明Pizza類為抽象類 */ public abstract class Pizza { //Pizza名稱 protected String name; //準備原材料,不同的披薩不一樣。因此,我們做成抽象方法,具體的原材料實現交給它的子類去完成 public abstract void prepare(); //烘烤 public void bake() { System.out.println(name + " baking;"); } //切割 public void cut() { System.out.println(name + " cutting;"); } //打包 public void box() { System.out.println(name + " boxing;"); } public void setName(String name) { this.name = name; } }
package com.szh.factory.abstractfactory.pizza; public class LDPepperPizza extends Pizza { @Override public void prepare() { setName("倫敦的胡椒pizza"); System.out.println("倫敦的胡椒pizza 準備原材料"); } }
package com.szh.factory.abstractfactory.pizza; public class LDCheesePizza extends Pizza { @Override public void prepare() { setName("倫敦的奶酪pizza"); System.out.println("倫敦的奶酪pizza 準備原材料"); } }
package com.szh.factory.abstractfactory.pizza; public class BJPepperPizza extends Pizza { @Override public void prepare() { setName("北京的胡椒pizza"); System.out.println("北京的胡椒pizza 準備原材料"); } }
package com.szh.factory.abstractfactory.pizza; public class BJCheesePizza extends Pizza { @Override public void prepare() { setName("北京的奶酪pizza"); System.out.println("北京的奶酪pizza 準備原材料"); } }
下面是抽象工廠和工廠方法的區別之處。
package com.szh.factory.abstractfactory.order; import com.szh.factory.abstractfactory.pizza.Pizza; //一個抽象工廠模式的抽象層(接口) public interface AbsFactory { //讓下面的工廠子類來具體實現 public Pizza createPizza(String orderType); }
package com.szh.abstractfactory.order; import com.szh.abstractfactory.pizza.BJCheesePizza; import com.szh.abstractfactory.pizza.BJPepperPizza; import com.szh.abstractfactory.pizza.Pizza; public class BJFactory implements AbsFactory { @Override public Pizza createPizza(String orderType) { Pizza pizza = null; if("cheese".equals(orderType)) { pizza = new BJCheesePizza(); } else if ("pepper".equals(orderType)){ pizza = new BJPepperPizza(); } return pizza; } }
package com.szh.abstractfactory.order; import com.szh.abstractfactory.pizza.LDCheesePizza; import com.szh.abstractfactory.pizza.LDPepperPizza; import com.szh.abstractfactory.pizza.Pizza; public class LDFactory implements AbsFactory { @Override public Pizza createPizza(String orderType) { Pizza pizza = null; if ("cheese".equals(orderType)) { pizza = new LDCheesePizza(); } else if ("pepper".equals(orderType)) { pizza = new LDPepperPizza(); } return pizza; } }
package com.szh.factory.abstractfactory.order; import com.szh.factory.abstractfactory.pizza.Pizza; import java.util.Scanner; public class OrderPizza { AbsFactory absFactory; public OrderPizza(AbsFactory absFactory) { setFactory(absFactory); } private void setFactory(AbsFactory absFactory) { Pizza pizza = null; String orderType = ""; // 用戶輸入 this.absFactory = absFactory; do { orderType = getType(); // factory 可能是北京的工廠子類,也可能是倫敦的工廠子類 pizza = absFactory.createPizza(orderType); if (pizza != null) { // 訂購ok pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } else { System.out.println("訂購失敗"); break; } } while (true); } // 寫一個方法,可以獲取客戶希望訂購的披薩種類 private String getType() { Scanner scanner = new Scanner(System.in); System.out.println("請輸入 pizza 種類: "); String str = scanner.nextLine(); return str; } }
最後是測試類。
package com.szh.abstractfactory; import com.szh.abstractfactory.order.BJFactory; import com.szh.abstractfactory.order.LDFactory; import com.szh.abstractfactory.order.OrderPizza; import java.util.Scanner; public class MainTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String content = scanner.next(); if ("Beijing".equals(content)) { new OrderPizza(new BJFactory()); } else if ("London".equals(content)) { new OrderPizza(new LDFactory()); } else { System.out.println("無法預先匹配Pizza種類...."); scanner.close(); } } }
3.工廠方法 + 抽象工廠總結
- 工廠模式的意義:將實例化對象的代碼提取出來,放到一個類中統一管理和維護,達到和主項目的依賴關系的解耦。從而提高項目的擴展和維護性。
- 遵循瞭依賴倒轉原則:創建對象實例時,不要直接new類,而是把這個new類的動作放在一個工廠的方法中,並返回。有的書上說,變量不要直接持有具體類的引用。 不要讓類繼承具體類,而是繼承抽象類或者是實現interface(接口)不要覆蓋基類中已經實現的方法。
到此這篇關於Java 深入理解創建型設計模式之抽象工廠模式的文章就介紹到這瞭,更多相關Java 抽象工廠模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++中策略模式和工廠模式的區別
- java設計模式–三種工廠模式詳解
- 深入理解Java設計模式之抽象工廠模式
- Java實現圖書管理系統的示例代碼
- Java工廠模式之簡單工廠,工廠方法,抽象工廠模式詳解