一、抽象工厂模式
基本介绍
定义了一个 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 }