到今天为止目前已经完成 5 中创建型设计模式中两种(简单工厂模式和工厂模式),今天呢小编给大家讲述设计模式中最后一种设计模式:抽象工厂模式。
在工厂模式中我们可以看出由于要解决在简单设计模式中工厂类过于集中来使用生产者-工厂一一对应的关系,从而导致在使用过程中有太多的工厂类,增多编码中类的数目。
如上图如果我们想要使用工厂模式实现上面按钮的实例,构建过程的方案是是下面的情况:
根据一个实例对象需要一个抽象产品类和一个实例产品类,一个抽象工厂类和实例工厂类总共 12 类来进行实现。这样就增大管理难度,和一如更多的类数目。
抽象工厂模式引入
上面看出在工厂模式中我们每一种工厂只能生产一种产品,这样当对上述需要如果我们需要更多皮肤或者其他就要增加过多的类。这样后面就会造成在维护过程难度较大并且会一如过多的类,比较繁琐。
有没有一个工厂可以生产多个产品?
下面介绍产品等级和产品族概念。
产品等级结构和产品族
- 产品等级结构:
产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
- 产品族:
在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
上图不同颜色的多个正方形、圆形和椭圆形分别构成了三个不同的产品等级结构,而相同颜色的正方形、圆形和椭圆形构成了一个产品族,每一个形状对象都位于某个产品族,并属于某个产品等级结构。上图中共有四个产品族,分属于三个不同的产品等级结构。我们只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一确定这个产品。
当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式。抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。
如下图抽象工厂模式:
每一个具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式,图4所示结构需要提供12个具体工厂,而使用抽象工厂模式只需要提供4个具体工厂,极大减少了系统中类的个数。
抽象工厂模式介绍
抽象工厂定义 : 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
角色介绍
抽象工厂模式中也有四中角色:AbstractFactory(抽象工厂)、ConcreteFactory(具体工厂)、AbstractProduct(抽象产品)和ConcreteProduct(具体产品)。
抽象工厂(AbstractFactory):
声明了一组用于创建一族产品的方法,每一个方法对应一种产品。具体工厂(ConcreteFactory):
实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。抽象产品(AbstractProduct):
为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。具体产品(ConcreteProduct):
定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
实例应用
在上述的皮肤设计中小编根据抽象工厂设计来给出重构的方案,具体实现如下图:
上面我们可以看出使用抽象工厂来对项目重构,减少实现过程中所用到的类的数目。后面更加利于我们维护项目和进行项目功能拓展。
优缺点
- 优点
1) 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
2) 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
3) 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
- 缺点
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
参考资料:
抽象工厂模式