通过前面对工厂方法模式的学习,我们已经了解到,对于系统中存在的单一的产品等级结构,甚至这些产品类可能存在更加复杂的继承关系,可以使用工厂方法模式来对应于这个产品等级结构。具体做法就是,在抽象工厂类中定义抽象工厂方法,具体工厂类继承自抽象工厂类并重写具体的构造方法,返回的具体产品对象是抽象产品类型的实例。
如果系统中存在多于一个产品等级结构,如果使用工厂方法模式,需要每个满足工厂方法模式的设计都对应一个产品等级结构,这样整个系统中就存在多个基于工厂方法模式的设计。
为了使得设计更加通用,使工厂更加抽象,同时也是为了解决工厂方法模式的随着产品等级结构增加而增加的缺点,这就导致了工厂方法模式中工厂角色数量的膨胀。于是,我们希望具有这样一个模式:使用更加抽象的工厂角色来替代多个工厂方法模式中多个抽象工厂角色,自然而然提出了抽象工厂模式。
抽象工厂模式能够解决产品等级结构增加所带来的系统设计问题,通过一个抽象工厂类,来向系统中客户端实现类提供请求产品的通用接口。无论任何一个产品等级结构发生变化,或者增加,都不会影响到客户端实现类,也就是说,抽象工厂类向客户端实现类屏蔽了系统中产品等级结构的复杂性。
抽象工厂模式的一般结构如图所示:
通过上图可以看出,具体工厂类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平行的抽象产品类,即能够增加一个新的产品等级结构。由于抽象工厂类中,抽象方法定义的返回值类型是与每个产品等级结构中的抽象产品类一一相对的,所以增加一个产品等级结构实际上增加了一个抽象产品类,同时要求能够生产该新增抽象产品类的具体产品对象,必然要求在抽象工厂类中增加一个生产方法来满足其需要。
可见,增加产品等级结构会使工厂发生完全的改动,包括抽象工厂类和具体工厂类,对其它产品等级结构并没有影响。
对此种需求,抽象工厂模式是不支持系统的松耦合设计的。
分享到:
相关推荐
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象集合的接口,而无需指定具体的产品类型。这种模式适用于当系统需要在不同平台或环境中创建一组相关或相互依赖的对象时,而这些...
1. **模式结构**:抽象工厂模式通常包括抽象工厂接口(AbstractFactory),具体工厂类(ConcreteFactory),抽象产品接口(Product)以及具体产品类(ConcreteProduct)。抽象工厂定义了创建产品的方法,而具体工厂...
1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖对象的接口。这个模式使得客户端代码与具体产品的实现解耦,从而提高了系统的灵活性和...
### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...
抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式是基于对象的抽象,而不是具体的类,因此,它允许创建一系列相关的对象,而无需指定...
1. 抽象工厂(Abstract Factory):这是模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。这个接口不直接创建产品,而是将产品创建的职责委托给具体工厂。 2. 具体工厂(Concrete ...
抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...
设计模式抽象工厂模式(AbstractFactory)源代码
1. **抽象工厂接口(Abstract Factory)**:定义了一系列产品的创建方法,例如`NWFactory`可能是这个抽象工厂的实现,它包含了创建人和动物的方法。 2. **具体工厂类(Concrete Factory)**:实现了抽象工厂接口,...
在这个例子中,`AbstractProductA`和`AbstractProductB`是抽象产品,`ConcreteProductA1/A2`和`ConcreteProductB1/B2`是具体产品,`AbstractFactory`是抽象工厂,`ConcreteFactory1/2`是具体工厂。客户端代码通过...
这个压缩包“C# 抽象工厂 AbstractFactory.rar”可能包含了一个关于如何在C#中实现抽象工厂模式的实例或教程。 抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方式,而无需指定具体类。在C#中,这种...
### C#设计模式之抽象工厂(Abstract Factory)模式详解 #### 概述 抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的一种,它提供了一个接口用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的...
在C#中实现抽象工厂模式(Abstract Factory Pattern)涉及定义一个抽象工厂接口,该接口声明用于创建抽象产品的方法。然后,为每个具体产品族实现一个具体工厂,这些工厂提供创建具体产品的实现。最后,客户端代码...
在给定的压缩包文件中,"AbstractFactory"可能包含了一些示例代码或者实现,用来解释抽象工厂模式的具体应用。这些代码可能包括抽象工厂接口、具体工厂类以及抽象产品和具体产品的定义。通过查看这些代码,我们可以...
1. **抽象工厂接口(Abstract Factory)**:定义了创建一组相关或相互依赖对象的接口,而不指定它们的具体类。在这个例子中,可以有一个`MarketFactory`接口,它声明了创建水果和蔬菜的方法,如`createFruit()`和`...
抽象工厂(Abstract Factory)模式是设计模式中的一种创建型模式,它提供了一种...在阅读提供的博客文章《AbstractFactory 抽象工厂》和研究压缩包中的相关文件时,你可以深入学习到更多关于这个模式的实践和应用场景。
Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂
1. 抽象工厂(Abstract Factory):定义一个创建对象的接口,但不指定具体的产品实现,而是由具体的工厂类来实现。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品对象。 3. 抽象产品...
**抽象工厂模式(Abstract Factory Pattern)**是一种创建型设计模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式是当一个系统需要根据不同的平台或者环境来创建一组相关或相互依赖的对象时,...