zoukankan      html  css  js  c++  java
  • 第四节:抽象工厂模式

    一、抽象工厂模式

      基本介绍

        1、抽象工厂模式:定义了一个 interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类;

        2、抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合;

        3、从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

        4、将工厂抽象成两层AbsFactory(抽象工厂)具体实现的工厂子类程序员可以根据创建对象类型使用对应的工厂子类。 这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展;

        

    二、代码实现

      使用抽象工厂模式来完成披萨项目。

      UML 类图:

        

      代码实现:

      Pizza 相关类:

     1 /**
     2  * 将Pizza 类做成抽象
     3  */
     4 public abstract class Pizza {
     5     protected String name;
     6     //准备原材料,不同的披萨不一样,因此,我们做成抽象方法
     7     public abstract void prepare();
     8 
     9     //烘焙
    10     public void bake() {
    11         System.out.println(name + " baking;");
    12     }
    13 
    14     //切割
    15     public void cut() {
    16         System.out.println(name + " cutting;");
    17     }
    18 
    19     //打包
    20     public void box() {
    21         System.out.println(name + " boxing;");
    22     }
    23 
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27 }
    28 -------------------------------------------------
    29 public class LDPepperPizza extends Pizza {
    30     @Override
    31     public void prepare() {
    32         setName("伦敦的胡椒pizza");
    33         System.out.println(" 伦敦的胡椒pizza 准备原材料");
    34     }
    35 }
    36 -------------------------------------------------
    37 public class LDCheesePizza extends Pizza {
    38     @Override
    39     public void prepare() {
    40         setName("伦敦的奶酪pizza");
    41         System.out.println(" 伦敦的奶酪pizza 准备原材料");
    42     }
    43 }
    44 -------------------------------------------------
    45 public class BJPepperPizza extends Pizza{
    46     @Override
    47     public void prepare() {
    48         setName("北京的胡椒pizza");
    49         System.out.println(" 北京的胡椒pizza 准备原材料");
    50     }
    51 }
    52 -------------------------------------------------
    53 public class BJCheesePizza extends Pizza {
    54     @Override
    55     public void prepare() {
    56         setName("北京的奶酪pizza");
    57         System.out.println(" 北京的奶酪pizza 准备原材料");
    58     }
    59 }

      Order 相关类:

     1 /**
     2  * 一个抽象工厂模式的抽象层(接口)
     3  */
     4 public interface AbsFactory {
     5     //让下面的工厂子类来 具体实现
     6     public Pizza createPizza(String orderType);
     7 }
     8 
     9 -----------------------------------------------------
    10 public class BJFactory implements AbsFactory {
    11     @Override
    12     public Pizza createPizza(String orderType) {
    13         System.out.println("~使用的是抽象工厂模式~");
    14         Pizza pizza = null;
    15         if(orderType.equals("cheese")) {
    16             pizza = new BJCheesePizza();
    17         } else if (orderType.equals("pepper")){
    18             pizza = new BJPepperPizza();
    19         }
    20         return pizza;
    21     }
    22 }
    23 -----------------------------------------------------
    24 public class LDFactory implements AbsFactory {
    25     @Override
    26     public Pizza createPizza(String orderType) {
    27         System.out.println("~使用的是抽象工厂模式~");
    28         Pizza pizza = null;
    29         if (orderType.equals("cheese")) {
    30             pizza = new LDCheesePizza();
    31         } else if (orderType.equals("pepper")) {
    32             pizza = new LDPepperPizza();
    33         }
    34         return pizza;
    35     }
    36 }
    37 -----------------------------------------------------
    38 public class OrderPizza {
    39 
    40     AbsFactory factory;
    41 
    42     public OrderPizza(AbsFactory factory) {
    43         setFactory(factory);
    44     }
    45 
    46     private void setFactory(AbsFactory factory) {
    47         Pizza pizza = null;
    48         String orderType = ""; //用户订购的类型
    49         this.factory = factory;
    50 
    51         do {
    52             orderType = getType();
    53             pizza = factory.createPizza(orderType);
    54 
    55             if (pizza != null) {
    56                 pizza.prepare();
    57                 pizza.bake();
    58                 pizza.cut();
    59                 pizza.box();
    60             } else {
    61                 System.out.println("订购失败,该种类还未上架,敬请期待!");
    62                 break;
    63             }
    64         } while (true);
    65 
    66     }
    67 
    68 
    69     // 写一个方法,可以获取客户希望订购的披萨种类
    70     private String getType() {
    71         try {
    72             BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
    73             System.out.println("input pizza 种类:");
    74             String str = strin.readLine();
    75             return str;
    76         } catch (IOException e) {
    77             e.printStackTrace();
    78             return "";
    79         }
    80     }
    81 }

      测试类:

     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 }

     

  • 相关阅读:
    CodeForces 514B
    CodeForces 514A
    UVa 818
    HDU 1003
    UVa百题总结
    UVa 11526
    UVa 12412
    UVa 211
    UVa 1587
    UVa 225 – Golygons [DFS+剪枝]
  • 原文地址:https://www.cnblogs.com/niujifei/p/14238275.html
Copyright © 2011-2022 走看看