一、简单工厂模式
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 }