六个创建模式之抽象工厂模式(Abstract Factory Pattern)
问题:
使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护。因此可以考虑使用一个工厂创建一个产品族。
定义:
提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品家族。
结构图:

- AbstractProduct:抽象产品类,抽象工厂模式中至少含有一个抽象产品类,每个抽象产品类派生出一个产品结构,定义了该产品结构中所有派生类的公开方法,方便于该产品的扩展。
- ConcreteProduct:具体产品类,抽象工厂模式中含有多种具体产品类,实现其对应的抽象产品类定义的方法。
- Factory:抽象工厂类,声明了一组用于创建一个产品家族的方法。
- ConcreteFactory:具体工厂类,每个工厂不在仅仅创建一个产品,而是由抽象工厂类定义的创建多个产品。
产品等级结构与产品族
- 产品等级结构即是产品的继承结构,具体产品类都派生自抽象产品类,抽象产品类在顶层。
- 产品族是由一个工厂生产的,位于不同产品等级结构的一组产品。

注意:
- 工厂方法可以看做特殊情况下的抽象工厂,即只含有一个产品结构,每个产品族只有一个产品。
- 抽象工厂模式的“开闭原则”具有倾斜性。对于加入一个产品族,是十分方便的,仅需要添加对应的具体产品类和一个具体具体工厂列。但是对于加入一个产品结构,则需要修改所有的工厂类,无法方便扩展。
优点:
- 隔离了类的具体实现,并隐藏了一个产品家族中产品的关联关系。如果要更换一个产品家族,只要更换到对应的具体工厂上。
- 当一个产品家族被设计成一起工作时,对应的工厂类可以做保证。
- 增加一个新的产品族十分方便,无需修改已有系统源码,符合“开闭原则”。
缺点:
- 无法增加新的产品等级结构,需要对原有代码进行较大的修改,甚至修改抽象层代码。
适用场景:
- 产品类型较多且与其它产品有一定的组合或关联关系,但用户无需关心对象创建过程。
- 系统中有多个产品族,且每次只使用一个产品族,可以通过配置文件等方式使用户可以动态地改变产品族。
- 产品等级结构稳定,在设计完成后不会出现新增产品等级结构的情况。
实例:

六个创建模式之抽象工厂模式(Abstract Factory Pattern)的更多相关文章
- 23种设计模式之抽象工厂(Abstract Factory Pattern)
抽象工厂 当想创建一组密不可分的对象时,工厂方法似乎就不够用了 抽象工厂是应对产品族概念的.应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品.比如,每个汽车公司可能要同时生产轿车.货车. ...
- 创建类模式(二):抽象工厂(Abstract Factory)
定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式. ...
- [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)
一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- java设计模式 -------- 创建模式 之 抽象工厂模式
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...
- 抽象工厂(Abstract Factory)模式
一.抽象工厂(Abstract Factory)模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family ...
- 设计模式的征途—3.抽象工厂(Abstract Factory)模式
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...
- c#工厂模式与抽象工厂模式
一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...
- 设计模式的征途—4.抽象工厂(Abstract Factory)模式
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
随机推荐
- VC中使用ATL库实现正则表达式匹配(ADODB::Error)
1. 确保项目属性中ATL使用处于打开状态. 如VS中项目属性常规—ATL使用—静态链接到ATL 2. 在使用时加上头文件 #include "atlrx.h" 3. 使用示例代码 ...
- python 跳出嵌套循环方法
class LoopError(Exception):pass rs = '' try: for i in range(1, 3): print i rs = 'one ' if i == 1: fo ...
- mac word 快捷键
https://support.office.com/en-us/article/Word-keyboard-shortcuts-c0ca851f-3d58-4ce0-9867-799df7366 ...
- android xml解析添加到listview中的问题
一个问题不知什么原因,代码: public class OtherActivity extends ListActivity { @Override protected void onCreate(B ...
- 如何重置CentOS 7的Root密码?设置CentOS 7的Root密码的方法与步骤
- 【开源】EFW框架系列文章索引
开源轻量级.Net框架EnterpriseFrameWork详解 ——自己动手写框架 ——适合中小企业的开发框架 ——Ajax+JqueryEasyUI+NotNetBar+MVC+WebServic ...
- `cocos2dx非完整` 游戏架构缩影 添加启动流程
这期的话题可能不是很好, 我没有想到很好的词句去更好的表达. 我一直都是很固执的认为, 同一类型的游戏,在开发做的前期工作上面其实都是可以复用的,也就是大同小异的.从游戏启动,启动日志,启动检查,检查 ...
- Linux下grep显示前后几行信息
Linux下grep显示前后几行信息 标准unix/linux下的grep通过下面參数控制上下文 grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行grep -B ...
- js-弹出窗口
一.JS最常用三种弹出对话框 1.对话框 //弹出对话框并输出一段提示信息 function ale() { //弹出一个对话框 alert("提示信息!"); } 2.询问框 / ...
- mysql DDL时出现的锁等待状态
如下表格所示: session1: session2: 10:30:27 root@localhost:[testdb] mysql.sock>select * from t2;+------+ ...