第四节:抽象工厂模式

一、抽象工厂模式

  基本介绍

    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 }

 

原文地址:https://www.cnblogs.com/niujifei/p/14238275.html