《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/