第二节:简单工厂模式(静态工厂模式) 一、简单工厂模式 二、静态工厂模式

  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 }