六个创建模式之抽象工厂模式(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关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
随机推荐
- 配置Pylint for Python3.5
事件的缘由是因为在Ubuntu16.04 下面安装了Visual Studio Code, 再编辑的时候说需要Pylint来检查语法,我系统的默认的Python 版本是python2,而我现在正在学习 ...
- 网上收集的以及自己总结的iOS开发技巧
Objective-C 1.让Xcode的控制台支持LLDB类型的打印 这有什么用? 怎么说尼,笔者认为这个还是比较有用滴,为什么有用尼? 因为在Xcode断点调试的时候, 在控制台输入 po sel ...
- JAVA笔记 之 JDK新特性
JDK1.5新特性1.泛型(Generics) 为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast) 2.增强的for循环(for ...
- HttpListenerCS客户端监听http
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- MAC 入门
1.安装java jdk eclipse 后发现运行不了,原因是JAVA_HOME 没有设置,真操蛋 export JAVA_HOME=`/usr/libexec/java_home` 2.安装bre ...
- c# 靠谱的bitmap转byte[]
public static byte[] Bitmap2Byte(Bitmap bitmap) { using (MemoryStream stream = new MemoryStream()) { ...
- HTML5[3]:中文换行
保证中文每行第一个字,不会出现标点符号 p { white-space: pre-wrap; }
- ionic 添加地图定位功能
由于项目需求,需要一个定位功能,通过google或百度,搜到一个cordova-plugin-geolocation的插件,在ios上可以用,但是在android就呵呵了,原因就不说了,大家都知道.所 ...
- [SLAM] 02 Some algorithms of 3D reconstruction
链接:http://www.zhihu.com/question/29885222/answer/100043031 首先一切建立在相机模型 x = kPX 上 x,X分别代表图片和空间中的二维三 ...
- [转载]SharePoint 2013搜索学习笔记之自定义结果源
搜索中心新建好之后在搜索结果页上会默认有所有内容,人员,对话,视频这四个结果分类,每个分类会返回指定范围的搜索结果,这里我再添加了部门日志结果分类,搜索这个分类只会返回部门日志内容类型的搜索结果,要实 ...