首页 > 代码库 > 《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/