前言:以下总结来自龙哥---左潇龙博客。
总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html
抽象工厂模式算是工厂相关模式的终极形态,它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品。这其实是工厂方法模式的一种扩展
通常意义来我们谈到扩展,通常有两种方式可以扩展一个接口或者类,就是继承和组合。
通常情况下,我们推荐使用组合扩展一个现有的类或接口,但这并非绝对,如果你扩展的子类或子接口与现有的类或接口明显是“是一个(is a)”的关系,也就是继承的关系,那么使用继承可以获得更多的好处。
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
定义中说了,我们是要创建一个接口,是为了创建一组相关或者相互依赖的对象,而且还有一点就是,我们创建的对象不是具体的类,也就是说我们创建的是一个接口或者一个抽象类。
1 interface ProductA { 2 3 void methodA(); 4 } 5 6 interface ProductB { 7 8 void methodB(); 9 } 10 11 class ProductA1 implements ProductA{ 12 13 public void methodA() { 14 System.out.println("产品A系列中1型号产品的方法"); 15 } 16 17 } 18 19 class ProductA2 implements ProductA{ 20 21 public void methodA() { 22 System.out.println("产品A系列中2型号产品的方法"); 23 } 24 25 } 26 27 class ProductB1 implements ProductB{ 28 29 public void methodB() { 30 System.out.println("产品B系列中1型号产品的方法"); 31 } 32 33 } 34 35 class ProductB2 implements ProductB{ 36 37 public void methodB() { 38 System.out.println("产品B系列中2型号产品的方法"); 39 } 40 41 } 42 43 public interface Creator { 44 45 ProductA createProductA(); 46 47 ProductB createProductB(); 48 49 } 50 51 public class ConcreteCreator1 implements Creator{ 52 53 public ProductA createProductA() { 54 return new ProductA1(); 55 } 56 57 public ProductB createProductB() { 58 return new ProductB1(); 59 } 60 61 } 62 63 public class ConcreteCreator2 implements Creator{ 64 65 public ProductA createProductA() { 66 return new ProductA2(); 67 } 68 69 public ProductB createProductB() { 70 return new ProductB2(); 71 } 72 73 } 74 75 public class Client { 76 77 public static void main(String[] args) throws Exception { 78 Creator creator = new ConcreteCreator1(); 79 ProductA productA = creator.createProductA(); 80 ProductB productB = creator.createProductB(); 81 productA.methodA(); 82 productB.methodB(); 83 84 creator = new ConcreteCreator2(); 85 productA = creator.createProductA(); 86 productB = creator.createProductB(); 87 productA.methodA(); 88 productB.methodB(); 89 } 90 }
抽象工厂模式一般是为了处理抽象产品多于一个的问题,而且这些产品多数情况下是有关系的。
基于抽象工厂一旦定义,抽象产品的个数就已经固定,所以最好在抽象产品的个数不太会变化的情况下使用抽象工厂模式,当然,我们可以使用继承去弥补抽象工厂模式的这一不足,创造另外一个继承体系去扩展现有的框架。
三种设计模式依次进化的原因:
1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。
我们在处理很多问题的时候其实是有很多种方式的,而且每一种方式可能都有各自的好处和坏处,很难去判断说那一种方式是最好的,而且也根本就没有这个说法,所以我们能做的,就是根据实际的情况去掂量各个方式的利弊,从而选择出一种更适合当前情况的处理方式。