第二節:簡單工廠模式(靜態工廠模式)
阿新 • • 發佈:2021-01-03
一、簡單工廠模式
1、基本介紹
(1)簡單工廠模式是屬於建立型模式,是工廠模式的一種。
(2)簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式。
(3)簡單工廠模式:定義了一個建立物件的類,由這個類來封裝例項化物件的行為(程式碼)。
(4)在軟體開發中,當我們會用到大量的建立某種、某類或者某批物件時,就會使用到工廠模式。
2、思路分析
針對於上一節的披薩訂購專案,我們可以使用 簡單工廠模式,定義一個可以例項化 Pizza 物件的類,封裝建立物件的程式碼。
然後專案中只要有需要獲取 Pizza 例項的地方,都可以使用該類獲取 Pizza 例項。
UML 類圖:
3、程式碼實現
簡單工廠類:
1 /**
2 * 簡單工廠類
3 */
4 public class SimpleFactory {
5
6 //根據 orderType 返回對應的 Pizza 物件
7 public Pizza createPizza(String orderType) {
8 Pizza pizza = null;
9
10 System.out.println("使用簡單工廠模式~");
11
12 if (orderType.equals("greek")) {
13 pizza = new GreekPizza();
14 pizza.setName("希臘披薩");
15 } else if (orderType.equals("cheese")) {
16 pizza = new CheesePizza();
17 pizza.setName("乳酪披薩");
18 } else if (orderType.equals("pepper")) {
19 pizza = new PepperPizza();
20 pizza.setName("胡椒披薩");
21 }
22 return pizza;
23 }
24 }
使用簡單工廠生成例項:
1 public class OrderPizza2 {
2
3 //使用聚合方式,定義一個簡單工廠物件
4 SimpleFactory simpleFactory;
5 Pizza pizza = null;
6
7 //構造器
8 public OrderPizza2(SimpleFactory simpleFactory) {
9 setSimpleFactory(simpleFactory);
10 }
11
12
13 public void setSimpleFactory(SimpleFactory simpleFactory) {
14 //使用者輸入的披薩型別
15 String orderType = "";
16
17 this.simpleFactory = simpleFactory;
18
19 do {
20 orderType = getType();
21 pizza = this.simpleFactory.createPizza(orderType);
22
23 //輸出 pizza
24 if (pizza != null) {
25 pizza.prepare();
26 pizza.bake();
27 pizza.cut();
28 pizza.box();
29 } else {
30 System.out.println("訂購披薩失敗,該種披薩還為上架!");
31 break;
32 }
33 } while (true);
34 }
35
36 //宣告一個方法,可以獲取客戶希望訂購的披薩種類
37 private String getType() {
38 try {
39 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
40 System.out.println("input pizza 種類:");
41 String str = bufferedReader.readLine();
42 return str;
43 } catch (IOException e) {
44 e.printStackTrace();
45 return "";
46 }
47 }
48 }
測試:
1 /**
2 * 相當於一個客戶端,發出訂購
3 */
4 public class PizzaStore {
5
6 public static void main(String[] args) {
7
8 //使用簡單工廠方式
9 new OrderPizza2(new SimpleFactory());
10
11 }
12 }
如果需要擴充套件對應的 Pizza 類,定義一個新的 Pizza的子類,然後在工廠類中根據不同的型別進行例項化,而其他的地方不需要改動。
二、靜態工廠模式
簡單工廠模式 也被稱為 靜態工廠模式。
靜態工廠模式:
1 public class SimpleFactory {
2
3 //簡單工廠模式 也被稱為 靜態工廠模式
4 public static Pizza makePizza(String orderType) {
5 Pizza pizza = null;
6
7 System.out.println("使用靜態工廠模式~");
8
9 if (orderType.equals("greek")) {
10 pizza = new GreekPizza();
11 pizza.setName("希臘披薩");
12 } else if (orderType.equals("cheese")) {
13 pizza = new CheesePizza();
14 pizza.setName("乳酪披薩");
15 } else if (orderType.equals("pepper")) {
16 pizza = new PepperPizza();
17 pizza.setName("胡椒披薩");
18 }
19 return pizza;
20 }
21
22 }
使用靜態工廠模式:
1 public class OrderPizza3 {
2
3 Pizza pizza = null;
4
5 //構造器
6 public OrderPizza3() {
7 //使用者輸入的披薩型別
8 String orderType = "";
9
10 do {
11 orderType = getType();
12 pizza = SimpleFactory.makePizza(orderType);
13
14 //輸出 pizza
15 if (pizza != null) {
16 pizza.prepare();
17 pizza.bake();
18 pizza.cut();
19 pizza.box();
20 } else {
21 System.out.println("訂購披薩失敗,該種披薩還為上架!");
22 break;
23 }
24 } while (true);
25 }
26
27
28
29
30 //宣告一個方法,可以獲取客戶希望訂購的披薩種類
31 private String getType() {
32 try {
33 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
34 System.out.println("input pizza 種類:");
35 String str = bufferedReader.readLine();
36 return str;
37 } catch (IOException e) {
38 e.printStackTrace();
39 return "";
40 }
41 }
42 }
測試程式碼:
1 /**
2 * 相當於一個客戶端,發出訂購
3 */
4 public class PizzaStore {
5
6 public static void main(String[] args) {
7 //不使用設計模式
8 //new OrderPizza();
9
10 //使用簡單工廠方式
11 //new OrderPizza2(new SimpleFactory());
12
13 //使用靜態工廠模式
14 new OrderPizza3();
15 }
16 }