产品蔟的创建--抽象工厂模式
2015-07-13 22:00
246 查看
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题,但由于工厂方法模式中每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个“产品蔟”,由同一个工厂统一生产,这就是抽象工厂模式的基本思想。
(2)产品族。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。例如,海尔电器工厂生产的海尔电视机、海尔电冰箱。海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成一个产品族。
抽象工厂模式和工厂方法模式最大的区别在于,工厂方法模式针对的只是一个产品等级结构,而抽象工厂需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。
在图6-4中,每一具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式,则需要15个具体工厂,而使用抽象工厂模式则只需要5个具体工厂,极大地减少了系统中类的个数。
在抽象工厂模式中,每一个具体工厂提供了多个工厂方法用于生产多种不同类型的产品,这些产品构成了一个产品族。
抽象工厂模式结构图中包含以下4个角色。
(1) AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
(2) ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生产一组具体产品,这些产品构成了一个产品族,每一个产品都位于某一个产品等级结构中。
(3) AbstractProduct(抽象产品):它为每种产品声明了接口,在抽象产品中声明了产品所具有的业务方法。
(4) ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。
(2)增加新的产品等级结构。对于增加新的产品等级结构,需要修改所以的工厂角色,包括抽象工厂类,在所以的工厂类中都需要增加生产新产品的方法,违背了开闭原则。
(2)增加新的产品族很方便,无需修改已有代码,符合开闭原则。
增加新的产品等级结构麻烦,需要对原有系统进行较大改进,甚至修改抽象层代码,违背了开闭原则。
(2) 增加新的产品族很方便,无需修改已有系统,符合开闭原则。
产品等级结构和产品蔟
有时候希望一个工厂可以提供多个产品对象,而不是单一的产品对象。例如一个电器工厂,它可以生产电视机、电冰箱和空调等多种电器,而不是只生产一种电器。产品等级结构
(1) 产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机和具体品牌的电视机构成了一个产品等级结构,抽象电视机是父类,具体品牌的电视机是其子类。(2)产品族。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。例如,海尔电器工厂生产的海尔电视机、海尔电冰箱。海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成一个产品族。
抽象工厂模式和工厂方法模式最大的区别在于,工厂方法模式针对的只是一个产品等级结构,而抽象工厂需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。
在图6-4中,每一具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式,则需要15个具体工厂,而使用抽象工厂模式则只需要5个具体工厂,极大地减少了系统中类的个数。
抽象工厂模式概述
抽象工厂模式:提供一个创建一系列相关对象的接口,而无需指定它们的具体类。在抽象工厂模式中,每一个具体工厂提供了多个工厂方法用于生产多种不同类型的产品,这些产品构成了一个产品族。
抽象工厂模式结构图
抽象工厂模式结构图中包含以下4个角色。
(1) AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
(2) ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生产一组具体产品,这些产品构成了一个产品族,每一个产品都位于某一个产品等级结构中。
(3) AbstractProduct(抽象产品):它为每种产品声明了接口,在抽象产品中声明了产品所具有的业务方法。
(4) ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。
开闭原则的倾斜性
(1) 增加产品族。对于增加新的产品族,抽象工厂模式很好地支持了开闭原则,只需要增加具体产品并对应添加一个新的具体工厂,对已有代码无需做任何修改。(2)增加新的产品等级结构。对于增加新的产品等级结构,需要修改所以的工厂角色,包括抽象工厂类,在所以的工厂类中都需要增加生产新产品的方法,违背了开闭原则。
抽象工厂模式总结
主要优点
(1) 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。(2)增加新的产品族很方便,无需修改已有代码,符合开闭原则。
主要缺点
增加新的产品等级结构麻烦,需要对原有系统进行较大改进,甚至修改抽象层代码,违背了开闭原则。适用场景
(1) 系统中有多个产品族,并且每次只使用其中某一个产品族。(2) 增加新的产品族很方便,无需修改已有系统,符合开闭原则。
相关文章推荐
- 快速傅立叶变换(FFT)
- 欧拉函数 素数原根 POJ 1284
- 32.求两个序列的和的最小差值
- Access中的SELECT @@IDENTITY
- Android(java)学习笔记128:使用proguard混淆android代码
- ubuntu 下搭建apache+python的运行环境
- vs 2013中设置vc 6.0 中的快捷键
- CvUserdata
- mahout中kmeans算法和Canopy算法实现原理
- ToDo List
- python——动态类型
- jenkins秘籍攻略收集
- python 正则表达式
- 第二章、Linux操作系统及常用命令
- Scala数组操作
- A glace on Java Stream
- 第一章、操作系统基础
- web设计_3_可伸缩的导航栏
- Linux下安装Redis
- IOS 创建简单表视图