一、分析需求
披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、 伦敦的胡椒pizza。
二、思路分析
1、思路一
使用简单工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好;
2、使用工厂方法模式
三、工厂方法模式
1、工厂方法模式设计方案
将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
2、工厂方法模式
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
四、代码实现
UML 类图:
Pizza 相关的类:
1 /**
2 * 将Pizza 类做成抽象
3 */
4 public abstract class Pizza {
5
6 protected String name;
7 //准备原材料,不同的披萨不一样,因此,我们做成抽象方法
8 public abstract void prepare();
9
10 //烘焙
11 public void bake() {
12 System.out.println(name + " baking;");
13 }
14
15 //切割
16 public void cut() {
17 System.out.println(name + " cutting;");
18 }
19
20 //打包
21 public void box() {
22 System.out.println(name + " boxing;");
23 }
24
25 public void setName(String name) {
26 this.name = name;
27 }
28
29 }
30
31 ---------------------------------------------
32 public class BJCheesePizza extends Pizza {
33 @Override
34 public void prepare() {
35 setName("北京的奶酪pizza");
36 System.out.println(" 北京的奶酪pizza 准备原材料");
37 }
38 }
39
40 --------------------------------------------
41 public class BJPepperPizza extends Pizza{
42 @Override
43 public void prepare() {
44 setName("北京的胡椒pizza");
45 System.out.println(" 北京的胡椒pizza 准备原材料");
46 }
47 }
48 ------------------------------------------
49 public class LDCheesePizza extends Pizza {
50 @Override
51 public void prepare() {
52 setName("伦敦的奶酪pizza");
53 System.out.println(" 伦敦的奶酪pizza 准备原材料");
54 }
55 }-----------------------------------------
56 public class LDPepperPizza extends Pizza {
57 @Override
58 public void prepare() {
59 setName("伦敦的胡椒pizza");
60 System.out.println(" 伦敦的胡椒pizza 准备原材料");
61 }
62 }
Order 订购相关类:
1 public abstract class OrderPizza {
2
3 /**
4 * 定义一个抽象方法, createPizza, 让各个工厂子类自己实现
5 */
6 abstract Pizza createPizza(String orderType);
7
8 //构造器
9 public OrderPizza() {
10 Pizza pizza = null;
11 String orderType; //订购披萨的类型
12 do {
13 orderType = getType();
14 pizza = createPizza(orderType);
15
16 if (pizza != null) {
17 //输出 pizza 制作过程
18 pizza.prepare();
19 pizza.bake();
20 pizza.cut();
21 pizza.box();
22 } else {
23 System.out.println("还未上架,敬请期待!");
24 break;
25 }
26
27 } while (true);
28 }
29
30 // 写一个方法,可以获取客户希望订购的披萨种类
31 private String getType() {
32 try {
33 BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
34 System.out.println("input pizza 种类:");
35 String str = strin.readLine();
36 return str;
37 } catch (IOException e) {
38 e.printStackTrace();
39 return "";
40 }
41 }
42 }
43 -------------------------------------------
44 public class BJOrderPizza extends OrderPizza {
45 @Override
46 Pizza createPizza(String orderType) {
47 Pizza pizza = null;
48 if(orderType.equals("cheese")) {
49 pizza = new BJCheesePizza();
50 } else if (orderType.equals("pepper")) {
51 pizza = new BJPepperPizza();
52 }
53
54 return pizza;
55 }
56 }
57 -------------------------------------------
58 public class LDOrderPizza extends OrderPizza {
59 @Override
60 Pizza createPizza(String orderType) {
61 Pizza pizza = null;
62 if(orderType.equals("cheese")) {
63 pizza = new LDCheesePizza();
64 } else if (orderType.equals("pepper")) {
65 pizza = new LDPepperPizza();
66 }
67 return pizza;
68 }
69 }
测试类:
1 public class PizzaStore {
2 public static void main(String[] args) {
3 String loc = "bj";
4 if (loc.equals("bj")) {
5 //创建北京口味的各种Pizza
6 new BJOrderPizza();
7 } else {
8 //创建伦敦口味的各种Pizza
9 new LDOrderPizza();
10 }
11 }
12 }