簡單工廠模式
案例:
披薩的項目(要便於披薩種類的擴展,要便於維護)
1)披薩的種類很多(比如 GreekPizz、CheesePizz 等) 2)披薩的制作有 prepare,bake, cut, box 3)完成披薩店訂購功能。
使用傳統的方式來完成
編寫 OrderPizza.java 去訂購需要的各種 Pizza
Pizza類
package com.lin.simplefactory; public class SimpleFactoryDemo { } abstract class Pizza{ private String name; public void setName(String name) { this.name = name; } public void prepare() { System.out.println(name + " are prepared!"); } public void bake() { System.out.println(name + " are baked!"); } public void cut() { System.out.println(name + " are cutted!"); } public void box() { System.out.println(name + " are boxed!"); } } // chesspizza class ChessPizza extends Pizza{ } // greekpizza class GreekPizza extends Pizza{ } // chinapizza class ChinaPizza extends Pizza{ }
OrderPizza類
package com.lin.simplefactory; import java.util.Scanner; /** * 假如有很多orderpizza,如果增加一種pizza種類,修改就很麻煩,效率低 * @Description: * @author LinZM * @date 2021-2-3 0:29:26 * @version V1.8 */ public class OrderPizza { public OrderPizza(){ Pizza pizza = null; String orderType; while(true) { orderType = getType(); if(orderType.equals("chess")) { pizza = new ChessPizza(); pizza.setName("chesspizza"); } else if(orderType.equals("greek")) { pizza = new GreekPizza(); pizza.setName("greekpizza"); } else if(orderType.equals("china")) { pizza = new ChinaPizza(); pizza.setName("chinapizza"); } else { break; } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } }public String getType() { Scanner str = new Scanner(System.in); System.out.println("please input the type of ordered pizza:"); String type = str.next(); return type; } }
PizzaStore類
package com.lin.simplefactory; public class PizzaStore { public static void main(String[] args) { new OrderPizza(); } }
傳統的方式的優缺點
1)優點是比較好理解,簡單易操作。 2)缺點是違反了設計模式的 ocp 原則,即對擴展開放,對修改關閉。即當我們給類增加新功能的時候,盡量不修改代碼,或者盡可能少修改代碼. 3)比如我們這時要新增加一個 Pizza 的種類(Pepper 披薩),我們需要做如下修改. 如果我們增加一個 Pizza 類,只要是訂購 Pizza 的代碼都需要修改.
改進的思路分析
分析:修改代碼可以接受,但是如果我們在其它的地方也有創建 Pizza 的代碼,就意味着,也需要修改,而創建 Pizza
的代碼,往往有多處。
思路:把創建 Pizza 對象封裝到一個類中,這樣我們有新的 Pizza 種類時,只需要修改該類就可,其它有創建到 Pizza
對象的代碼就不需要修改了.-> 簡單工廠模式
基本介紹
1) 簡單工廠模式是屬於創建型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式。
2) 簡單工廠模式:定義了一個創建對象的類,由這個類來封裝實例化對象的行為(代碼)。
3) 在軟件開發中,當我們會用到大量的創建某種、某類或者某批對象時,就會使用到工廠模式。
使用簡單工廠模式
簡單工廠模式的設計方案: 定義一個可以實例化 Pizaa 對象的類,封裝創建對象的代碼。
Pizza類不變
OrderPizza類
package com.lin.simplefactory; import java.util.Scanner; /** * 假如有很多orderpizza,如果增加一種pizza種類,修改就很麻煩,效率低 * @Description: * @author LinZM * @date 2021-2-3 0:29:26 * @version V1.8 */ public class OrderPizza { //定義一個工廠對象 public SimpleFactory factory = null; public Pizza pizza = null; // 構造器 public OrderPizza(SimpleFactory factory) { setFactory(factory); } public void setFactory(SimpleFactory factory) { String type = ""; this.factory = factory; while(true) { type = getType(); pizza = this.factory.createPizza(type); if(pizza != null) { pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } else { System.out.println("沒有這種披薩!"); break; } } } public String getType() { Scanner str = new Scanner(System.in); System.out.println("please input the type of ordered pizza:"); String type = str.next(); return type; } }
增加一個類--SimpleFatcory類
package com.lin.simplefactory; /** * 簡單工廠模式 * @Description: * @author LinZM * @date 2021-2-3 0:28:04 * @version V1.8 */ public class SimpleFactory { public Pizza createPizza(String orderType) { Pizza pizza = null; System.out.println("使用簡單工廠模式"); if(orderType.equals("chess")) { pizza = new ChessPizza(); pizza.setName("chesspizza"); } else if(orderType.equals("greek")) { pizza = new GreekPizza(); pizza.setName("greekpizza"); } else if(orderType.equals("china")) { pizza = new ChinaPizza(); pizza.setName("chinapizza"); } return pizza; } }
PizzaStore類
package com.lin.simplefactory; public class PizzaStore { public static void main(String[] args) { // new OrderPizza(); new OrderPizza(new SimpleFactory()); } }
同時,簡單工廠模式又叫靜態工廠模式,在OrderPizza類中將creatPizza改為static,在后面使用類.方法名方式調用該方法。
僅供參考,有錯誤還請指出!
有什么想法,評論區留言,互相指教指教。