《JAVA与模式》之抽象工厂模式

  Abstract Factory定义 
   为一系列相关对象或相互依赖的对象创建一个接口,而无需指定它们的具体类。抽象工厂在这里起到一个约束的作用,并提供所有子类的一个统一外观,来让客户端使用 

上面的uml图,我们会发现,ConcreteFactory1只会生成A1+B1,是有严格约束的,如果没有这个约束条件,则可用工厂方法代替


举个例子,有个抽象汽车工厂负责生产汽车,我们假设生产汽车的过程包括汽车门和汽车轮子,目前有奥迪和奔驰两个工厂,分别生产各自的汽车

 1 // 抽象工厂
 2 interface AbstractCarFactory {
 3     /** 生产汽车门 */
 4     public Door createDoor();
 5 
 6     /** 生产汽车轮子 */
 7     public Wheel createWheel();
 8 
 9 }
10 
11 class BenzFactory implements AbstractCarFactory {
12 
13     public Door createDoor() {
14         // TODO Auto-generated method stub
15         return new BenzDoor();
16     }
17 
18     public Wheel createWheel() {
19         // TODO Auto-generated method stub
20         return new BenzWheel();
21     }
22 }
23 
24 class AudiFactory implements AbstractCarFactory {
25 
26     public Door createDoor() {
27         // TODO Auto-generated method stub
28         return new AudiDoor();
29     }
30 
31     public Wheel createWheel() {
32         // TODO Auto-generated method stub
33         return new AudiWheel();
34     }
35 }
36 
37 interface Door {
38     // public void createDoor();
39 }
40 
41 interface Wheel {
42 
43     // public void createWheel();
44 }
45 
46 class BenzDoor implements Door {
47 
48     public BenzDoor() {
49         System.out.println("生产奔驰汽车门");
50     }
51 }
52 
53 class AudiDoor implements Door {
54 
55     public AudiDoor() {
56         System.out.println("生产奥迪汽车门");
57     }
58 }
59 
60 class BenzWheel implements Wheel {
61 
62     public BenzWheel() {
63         System.out.println("生产奔驰轮子");
64     }
65 }
66 
67 class AudiWheel implements Wheel {
68 
69     public AudiWheel() {
70 
71         System.out.println("生产奥迪轮子");
72     }
73 
74 }

测试代码

// 抽象工厂 在工厂方法基础上 复杂了产品线 即产品组 多个产品配件组成一个工厂产品并且产品是一个系列的,随意组合就不能构成最终的产品

        AbstractCarFactory beazFactory = new BenzFactory();
        AbstractCarFactory audiFactory = new AudiFactory();
        beazFactory.createDoor();
        audiFactory.createWheel();

ps:本例子中缺少一个角色,负责组装产品,这个角色中定义了抽象工厂,最后通过具体工厂对象来组装产品,这里就省略了

我们整理下代码

发现抽象工厂模式由几个角色组成

1.抽象工厂角色

2.具体工厂角色

3.抽象产品角色

4.具体产品角色

具体工厂负责组装不同的产品角色,最后形成产品

简单工厂、工厂方法、抽象工厂区别

总结:用最简单的话来概括就是,简单工厂只有一个具体工厂类来创建一种基类的多个不同派生类,工厂方法就是有多个派生于一个基类的具体工厂类,每个具体工厂只生产一种基类的一个派生类,抽象工厂也是只有一个工厂基类,但是每个具体工厂生产多个相关基类的各一个派生类。

参考:

http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

http://men4661273.iteye.com/blog/1637880

http://blog.csdn.net/yuan22003/article/details/6709630   

 http://tianli.blog.51cto.com/190322/32545/

原文地址:https://www.cnblogs.com/draem0507/p/3796286.html