意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
举个例子
这类模式主要解决一类相互关联的对象如何创造的,抽象工厂,字面理解,是将工厂模式再抽象了,抽象的目的是什么,创建工厂类,创建工厂类的目的是什么,是使用工厂创建具体的实例。从这段话中我们可以理解到什么,首先,必须有工厂类,而且不止一个工厂,且工厂创建的类是相互关联的。我们的目的是调用关联的工厂类来实现我们创建相互关联的对象的目的。
举个菜鸟教程的例子:
我们要创建一个有红色的圆形和创建一个蓝色的矩形。说明下,这里我们将颜色和形状抽象为两个关联的类,而非将颜色当成形状的属性。
我们来套用SOLID原则
首先我们
找名词:我们,红色,圆形,蓝色,矩形
找动词:创建
抽象:
我们抽象成一个调用类
红色、蓝色类,抽象的父类 颜色类
圆形和矩形类,抽象为形状类
调用类有个方法创建
为了满足SOLID原则,我需要类来给我们提供颜色和形状,一个颜色的工厂类和形状类,因为这两个类是关联的,要变化一起变化,所以我们在这两个类的基础上抽象出这两个类工厂的工厂,形状颜色工厂父类,该父类有提供颜色和形状的功能,如果要提供颜色则调用颜色的工厂类提供颜色对象,需要形状类则提供形状的工厂类来提供形状类。
大家发现了什么问题,就是抽象工厂类承当了两个责任,显然违法了单一性原则,但为了对象之间关联的这个特性,也只能做出如此牺牲了。
具体实现见菜鸟教程