抽象工厂模式(Abstract Factory)(转)

通过前面对工厂方法模式的学习,我们已经了解到,对于系统中存在的单一的产品等级结构,甚至这些产品类可能存在更加复杂的继承关系,可以使用工厂方法模式来对应于这个产品等级结构。具体做法就是,在抽象工厂类中定义抽象工厂方法,具体工厂类继承自抽象工厂类并重写具体的构造方法,返回的具体产品对象是抽象产品类型的实例。

如果系统中存在多于一个产品等级结构,如果使用工厂方法模式,需要每个满足工厂方法模式的设计都对应一个产品等级结构,这样整个系统中就存在多个基于工厂方法模式的设计。

为了使得设计更加通用,使工厂更加抽象,同时也是为了解决工厂方法模式的随着产品等级结构增加而增加的缺点,这就导致了工厂方法模式中工厂角色数量的膨胀。于是,我们希望具有这样一个模式:使用更加抽象的工厂角色来替代多个工厂方法模式中多个抽象工厂角色,自然而然提出了抽象工厂模式。

抽象工厂模式能够解决产品等级结构增加所带来的系统设计问题,通过一个抽象工厂类,来向系统中客户端实现类提供请求产品的通用接口。无论任何一个产品等级结构发生变化,或者增加,都不会影响到客户端实现类,也就是说,抽象工厂类向客户端实现类屏蔽了系统中产品等级结构的复杂性。

抽象工厂模式的一般结构如图所示:


 

 

 

通过上图可以看出,具体工厂类ConcreteProductFactory中的produce生产方法能够创建ConcreteProduct类对象;而具体工厂类ConcreteGoodsFactory中的manufacture生产方法能够创建ConcreteGoods类对象。

可见,每个具体工厂类中,只有一个生产方法被实际使用,因为AbstractGoods与AbstractProduct抽象产品类的具体产品类中,只存在一个具体产品类,不能实现横向地与具体工厂类中方法一一对应,这就是其中的问题所在,如果只有这种简单的产品等级结构完全可以采用其他的设计模式来设计。上图示意性地表达了每个具体产品类角色。

抽象工厂模式存在四个不同的角色,如下所示:

01.抽象工厂角色
02.具体工厂角色
03.抽象产品角色
04.具体产品角色

抽象工厂模式中,各个角色的含义描述如下:

01.抽象工厂角色

抽象工厂角色能够实现产品等级结构中具体产品的生产工作,可以理解为,抽象工厂角色是多个工厂方法模式中的抽象工厂方法的聚合。也就是说,如果使用工厂方法模式来设计,为了实现多个产品等级结构的具体产品的生产,需要多个抽象工厂方法,每个抽象工厂方法对应一个产品等级,即对应多套工厂方法模式,而使用抽象工厂模式,将多个抽象工厂方法放到同一个抽象工厂类中,就能够通过一个抽象工厂类实现多个产品等级结构的具体产品的生产。

为了使设计更加优雅,每个抽象工厂方法返回的产品对象的类型(是抽象产品类型)能够体现同产品等级结构之间的合理关系,需要在产品等级结构的设计上下功夫。同时,抽象工厂了中抽象工厂方法的定义与设计是非常核心的,会直接影响到具体工厂类的实现。

 

02.具体工厂角色

具体工厂角色,必须基于抽象工厂角色。抽象工厂类向客户端暴露了通过多个方法获取不同具体产品对象,既然给出了这些方法,具体工厂类必须按照抽象工厂定义的抽象方法来实现具体产品的生产工作。

每个具体的工厂类一定实现了抽象工厂类中定义的方法,所以每个具体工厂实现类中一定存在相同数量的声场方法的实现。

一个具体工厂类,不仅需要明确了解,通过横向看来对应的多个产品等级结构的特点,还要知道相关的每个具体产品类的创建方法,而以何种“面貌”返回给请求创建者完全由抽象工厂类来决定。

 

03.抽象产品角色

抽象产品角色是抽象工厂模式中另一个非常重要的角色,在实际设计中要提高产品等级结构设计的抽象性与合理性。

当存在很多的产品等级结构时,会导致产品层次的参差不齐,当然最理想的情况就是,所有的产品等级都是平行的,即:纵向来看,所有的产品等级层次数相同;横向来看,处于同一层次的产品在某一个特定的范围内具有相同或类似功能特性。这里这样说,可能非常抽象,后面给出更感性的表达。事实上现实生活中很少存在如此整齐的产品层次,从这一点也能够体现出系统设计者的抽象、分析与设计能力。

抽象产品类是工厂生产产品对象的返回类类型,向客户端屏蔽具体产品的细节。同时,对多个产品等级结构进行抽象,得到抽象产品类,其抽象设计的好坏直接影响到具体产品实现类。

 

04.具体产品角色

 

具体产品角色,在抽象工厂模式中,该角色更加真实地、生动地表现了现实生活中与商业逻辑相关的产品,更能让我们感觉到它的存在形态、功用、特点等等。通过多个产品等级结构中多个产品类之间的关系,我们能够更加直接地看到它们出现在怎样的场景中,从而反过来根据具体的应用场景来设计整个产品等级结构。

整个产品等级结构,是抽象产品类与具体产品类共同组成,它们又是以工厂类(抽象工厂类与具体工厂类)的设计为依据的,使得工厂类能够更加高效的生产产品类的对象,又能够让多个不同的客户端类请求的结果视图的一致性。

上面对抽象工厂模式的各个角色进行详细的描述,包括每个角色的特点,及其与其它角色的联系。下面通过实际的情况来对常见的抽象工厂模式的应用进行说明。

第一种:

上图中,基于抽象工厂模式设计的表示中,组成模式的各个角色具体,以及上图的特征,阐述如下:

抽象工厂类是ComponentFactory类(部件抽象工厂类);

一个抽象产品等级结构为:AbstractTransportBody类(抽象运输工具车体类),及其TrainBody类(火车车体类)和LorryBody类(卡车车体类);

另一个抽象产品等级结构为:AbstractWheel类(抽象车轮类),以及TrainWheel类(火车车轮类)和LorryWheel类(卡车车轮类);

每个具体工厂类既能够生产AbstractTransportBody类(抽象运输工具车体类)的具体子类对象,也能够生产AbstractWheel类(抽象车轮类)的具体子类对象;

每个抽象产品类(AbstractTransportBody类,或AbstractTransportBody类)恰好能够为抽象共产类的两个具体工厂,分别提供创建产品生产方式。

可见,通过一个具体工厂可以获取到多个产品等级结构中的具体产品对象,而这些对象同时恰能够构成一个整体,这种关系非常微妙,也是实际设计中需要进行重点分析的。这样的设计,能够很好地组织系统中存在的产品角色类,对于稍微复杂的系统,很容易对产品等级结构进行横向扩展。

第二种:

 

最下面的三个类,是具体产品类和具体工厂类,分别扩展了每一个抽象产品类和抽象工厂类。

针对第一种情况,由于需求变化,产品等级结构没有增加(保持为抽象产品类AbstractTransportBody和AbstractWheel两个),具体产品增加了(扩展了AbstractTransportBody类的具体产品类AircraftBody,和扩展了AbstractWheel类的具体产品类AircraftWheel),而且是在同一个层次上增加的,只需要增加一个具体工厂类(AircraftComponentFactory)对应于增加的产品类(AircraftBody、AircraftWheel),即完成了扩展。

 

 

 

 

 

可以看到,增加每一个产品等级结构中处于同一层次的产品,根本无需修改现有的代码,达到了系统的松耦合设计。

第三种:

考虑产品等级结构增加的需求:

增加与AbstractTransportBody、AbstractWheel平行的抽象产品类,即能够增加一个新的产品等级结构。由于抽象工厂类中,抽象方法定义的返回值类型是与每个产品等级结构中的抽象产品类一一相对的,所以增加一个产品等级结构实际上增加了一个抽象产品类,同时要求能够生产该新增抽象产品类的具体产品对象,必然要求在抽象工厂类中增加一个生产方法来满足其需要。

可见,增加产品等级结构会使工厂发生完全的改动,包括抽象工厂类和具体工厂类,对其它产品等级结构并没有影响。

对此种需求,抽象工厂模式是不支持系统的松耦合设计的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值