Abstract Factory定义
为一系列相关对象或相互依赖的对象创建一个接口,而无需指定它们的具体类。抽象工厂在这里起到一个约束的作用,并提供所有子类的一个统一外观,来让客户端使用
上面的uml图,我们会发现,ConcreteFactory1只会生成A1+B1,是有严格约束的,如果没有这个约束条件,则可用工厂方法代替
举个例子,有个抽象汽车工厂负责生产汽车,我们假设生产汽车的过程包括汽车门和汽车轮子,目前有奥迪和奔驰两个工厂,分别生产各自的汽车
1 //抽象工厂
2 interfaceAbstractCarFactory {3 /**生产汽车门*/
4 publicDoor createDoor();5
6 /**生产汽车轮子*/
7 publicWheel createWheel();8
9 }10
11 class BenzFactory implementsAbstractCarFactory {12
13 publicDoor createDoor() {14 //TODO Auto-generated method stub
15 return newBenzDoor();16 }17
18 publicWheel createWheel() {19 //TODO Auto-generated method stub
20 return newBenzWheel();21 }22 }23
24 class AudiFactory implementsAbstractCarFactory {25
26 publicDoor createDoor() {27 //TODO Auto-generated method stub
28 return newAudiDoor();29 }30
31 publicWheel createWheel() {32 //TODO Auto-generated method stub
33 return newAudiWheel();34 }35 }36
37 interfaceDoor {38 //public void createDoor();
39 }40
41 interfaceWheel {42
43 //public void createWheel();
44 }45
46 class BenzDoor implementsDoor {47
48 publicBenzDoor() {49 System.out.println("生产奔驰汽车门");50 }51 }52
53 class AudiDoor implementsDoor {54
55 publicAudiDoor() {56 System.out.println("生产奥迪汽车门");57 }58 }59
60 class BenzWheel implementsWheel {61
62 publicBenzWheel() {63 System.out.println("生产奔驰轮子");64 }65 }66
67 class AudiWheel implementsWheel {68
69 publicAudiWheel() {70
71 System.out.println("生产奥迪轮子");72 }73
74 }
测试代码
//抽象工厂 在工厂方法基础上 复杂了产品线 即产品组 多个产品配件组成一个工厂产品并且产品是一个系列的,随意组合就不能构成最终的产品
AbstractCarFactory beazFactory= newBenzFactory();
AbstractCarFactory audiFactory= newAudiFactory();
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/
原文:http://www.cnblogs.com/draem0507/p/3796286.html