1. 程式人生 > 實用技巧 >第二節:簡單工廠模式(靜態工廠模式)

第二節:簡單工廠模式(靜態工廠模式)

一、簡單工廠模式

  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 }