读《大话设计模式》之抽象工厂模式

一、模式概述:

提供一个创建一系列相关或互相依赖的接口,而无需指定它们具体的类。

先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。

UML图:

抽象工厂模式

  • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

  • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

二、模式优缺点:

优点:

1、 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、 增加新的具体工厂和产品族很方便,无须修改已有系统,符合开闭原则。

缺点:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对开闭原则的支持呈现倾斜性。
如果需要增加新的产品树,那么就要新增三个产品类,并且要修改三个工厂类。这样大批量的改动是很丑陋的做法。
所以可以用简单工厂配合反射来改进抽象工厂。

三、模式适用场景:

1、 系统中有多个产品族,而系统一次只可能消费其中一族产品
2、 同属于同一个产品族的产品以其使用。
当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

四、模式总结:

提供一个创建一系列相关或互相依赖的接口,而无需指定它们具体的类。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。