一、分析需求

  披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、 伦敦的胡椒pizza

二、思路分析

  1、思路一

    使用简单工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactoryLDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好;

 

  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 }

 

 

 

posted on 2021-01-04 22:30  格物致知_Tony  阅读(78)  评论(0编辑  收藏  举报