一、抽象工厂模式

  基本介绍

定义了一个 interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类;

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

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

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

    

二、代码实现

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

  UML 类图:

    

三层架构抽象工厂模式优点 抽象工厂模式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 }