• 第三节:工厂方法模式


    一、分析需求

      披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪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 }

     

  • 相关阅读:
    MySQL
    Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等
    ps
    top
    sed
    nav响应范围一定要足够宽
    续上获取input的checked用prop时返回的是布尔值
    jq不应该用attr获取input的check值
    jq祖级元素
    一些jquery的坑
  • 原文地址:https://www.cnblogs.com/niujifei/p/14232952.html
Copyright © 2020-2023  润新知