设计模式就该这样学:基于经典框架源码和真实业务场景
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第7章 抽象工厂模式

7.1 抽象工厂模式概述

7.1.1 抽象工厂模式的定义

抽象工厂模式(Abstract Factory Pattern)指提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。意思是客户端不必指定产品的具体类型,创建多个产品族中的产品对象。

原文:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

在抽象工厂模式中,客户端(应用层)不依赖产品类实例如何被创建、实现等细节,强调一系列相关的产品对象(属于同一产品族)一起创建对象,需要大量重复的代码。

需要提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖具体实现。

7.1.2 关于产品等级结构和产品族

在讲解抽象工厂之前,我们要了解两个概念:产品等级结构和产品族,如下图所示。

img

上图中有正方形、圆形和菱形3种图形,相同颜色、相同深浅的代表同一个产品族,相同形状的代表同一个产品等级结构。同样可以从生活中来举例,比如,美的电器生产多种家用电器,那么上图中,颜色最深的正方形就代表美的洗衣机,颜色最深的圆形代表美的空调,颜色最深的菱形代表美的热水器,颜色最深的一排都属于美的品牌,都属于美的电器这个产品族。再看最右侧的菱形,颜色最深的被指定了代表美的热水器,那么第二排颜色稍微浅一点的菱形代表海信热水器。同理,同一产品族下还有格力洗衣机、格力空调、格力热水器。

再看下图,最左侧的小房子被认为是具体的工厂,有美的工厂、海信工厂、格力工厂。每个品牌的工厂都生产洗衣机、空调和热水器。

img

通过上面两张图的对比理解,相信大家对抽象工厂有了非常形象的理解。

7.1.3 抽象工厂模式的应用场景

抽象工厂模式适用于需要生成产品族的情景。抽象产品类内部提供了多个其他抽象产品,抽象工厂类定义了产品的创建接口,通过具体的工厂子类,就可以生产相应的产品族对象,供用户端使用。

7.1.4 抽象工厂模式的UML类图

抽象工厂模式的UML类图如下。

img

由上图可以看到,抽象工厂模式主要包含4个角色。

(1)抽象工厂(IAbstractFactory):声明创建抽象产品对象的一个操作接口。

(2)具体工厂(ConcreteFactory):实现创建具体产品对象的操作。

(3)抽象产品(IAbstractProduct):为一类产品对象声明一个接口。

(4)具体产品(ConcreteProduct):定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口。

7.1.5 抽象工厂模式的通用写法

以下是抽象工厂模式的通用写法。

img
img
img