首页 > 代码库 > 《JAVA与模式》之抽象工厂模式
《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 stub15 return new BenzDoor();16 }17 18 public Wheel createWheel() {19 // TODO Auto-generated method stub20 return new BenzWheel();21 }22 }23 24 class AudiFactory implements AbstractCarFactory {25 26 public Door createDoor() {27 // TODO Auto-generated method stub28 return new AudiDoor();29 }30 31 public Wheel createWheel() {32 // TODO Auto-generated method stub33 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/