设计模式的目的就是尽量减少“变化”对程序的影响,尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种,解决的就是“new”在变化中可能引起的问题。

先来看看new有何种不好,举个创建汽车的车门的例子:
很自然的一种想法是:Door *door = new Door();
但是如果遇到创建老爷车的车门,创建现代车的车门,这段代码就无所适从了。

OO为我们提供了哪些精华的思想?“封装”,是的,将车门的创建封装起来,于是我们有了静态工厂方法: 
客户程序代码:

1Door* door = doorFactory->CreateDoor();

库程序代码:

1class DoorFactory
2{
3public:
4  Door* CreateDoor()
5  {
6    return new Door();
7  }
8}

客户程序在此是不会变化的,不管你是老爷车门,现代车门,还是钻石车门,这些和客户程序代码都是没关系的,究竟CreateDoor出来如何结果都交给多态来判断,我们不用操心。
但是库程序代码还是需要更改的,但我们已经将“变化”与客户程序隔离了。

需求又有变化了,不光要创建车门,还需要创建引擎,车灯,而且还是不同风格的。
这时候静态工厂已经应付不来了,静态工厂有其自身的缺陷“不能应对不同系列对象”的变化。

动机:
软件系统中,经常面临“一系列相互依赖的对象”的创建工作。(两个特征:“一系列”,“相互依赖”)
将创建过程封装起来,避免“客户程序”和“多系列具体对象的创建工作”的紧耦合。

意图:
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类。(GoF23)

思路:

对于客户程序来说,只依赖于三个抽象的类:AbstractFactory,AbstractProductA,AbstractProductB。
以下是客户程序代码:

 1class CarManager
 2{
 3protected:
 4    AbstractFactory *abstractFactory;
 5public:
 6    //创造Car
 7    void createCar(AbstractFactory *abstractFactory)
 8    {
 9        abstractFactory->CreateEngine();
10        abstractFactory->CreateDoor();
11        abstractFactory->CreateLight();
12    }
13    //其他的操作
14    void run(){}
15};
16
17int _tmain(int argc, _TCHAR* argv[])
18{
19    CarManager *carManager = new CarManager();
20    //创建Classic风格的汽车
21    carManager->createCar(new ClassicFactory());
22
23    return 0;
24}

所有关于创建的操作都是用抽象类完成的,对于具体是何种类型的对象由多态实现,以此来使“客户代码”和“多系列具体对象的创建工作”达到松耦合。

如果遇到还需要扩展其他风格的汽车,可以按下图的思路

红色的部分对应新风格的车辆,只需在库程序中添加ConcreteFactory3,ProductA3,ProductB3三个类,而对于客户代码CarManager来说完全不受影响。

总结:
AbstractFactory模式有以下三个要点:
1.应对的问题是“多风格的系列对象创建”的变化问题,“系列对象”指的是这些对象之间有相互依赖或者相互作用的关系。否则使用“静态工厂”足以。
2.抽象工厂和静态工厂的核心是“封装”,将对象的创建进行封装,避免“new”引起的问题
3.抽象工程的另一个核心是“多态”,通过动态绑定来处理“不同风格”的问题

注:
AbstractFactory模式主要针对“风格”的变化,如果“对象”本身经常变化,那么该模式并不适用。

自己做的示例代码,仅供参考

  1//
  2// AbstractFactoryTest for AbstractFactory Pattern Test
  3//
  4//
  5
  6#include "stdafx.h"
  7#include "iostream"
  8using namespace std;
  9
 10//Engine,Door,Light are the Abstract Product
 11//这三个类对应UML图中的AbstractProduct类
 12class Engine
 13{
 14public:
 15    Engine()
 16    {
 17        cout<<"Abstract Engine Create"<<endl;
 18    }
 19    virtual void doSomething() = 0;
 20};
 21
 22class Door
 23{
 24public:
 25    Door()
 26    {
 27        cout<<"Abstract Door Create"<<endl;
 28    }
 29    virtual void doSomething() = 0;
 30};
 31
 32class Light
 33{
 34public:
 35    Light()
 36    {
 37        cout<<"Abstract Light Create"<<endl;
 38    }
 39    virtual void doSomething() = 0;
 40};
 41
 42//Abstract Factory
 43class AbstractFactory
 44{
 45public:
 46    AbstractFactory()
 47    {
 48        cout<<"AbstractFactory Create"<<endl;
 49    }
 50    virtual Engine* CreateEngine() = 0;
 51    virtual Door* CreateDoor() = 0;
 52    virtual Light* CreateLight() = 0;
 53};
 54
 55//SpeedEngine,SpeedDoor,SpeedLight are the Products of Speed Style 
 56//这三个类对应UML图中的ProductA1,ProductB1,ProductC1类
 57class SpeedEngine:public Engine
 58{
 59public :
 60    SpeedEngine()
 61    {
 62        cout<<"Speed Engine Create"<<endl;
 63    }
 64    void doSomething(){    }
 65};
 66
 67class SpeedDoor:public Door
 68{
 69public :
 70    SpeedDoor()
 71    {
 72        cout<<"Speed Door Create"<<endl;
 73    }
 74    void doSomething(){    }
 75};
 76
 77class SpeedLight:public Light
 78{
 79public :
 80    SpeedLight()
 81    {
 82        cout<<"Speed Light Create"<<endl;
 83    }
 84    void doSomething(){    }
 85};
 86
 87//classicEngine,classicDoor,classicLight are the products of Classic style
 88//这三个类对应UML图中的ProductA2,ProductB2,ProductC2类
 89class ClassicEngine:public Engine
 90{
 91public :
 92    ClassicEngine()
 93    {
 94        cout<<"Classic Engine Create"<<endl;
 95    }
 96    void doSomething(){    }
 97};
 98
 99class ClassicDoor:public Door
100{
101public :
102    ClassicDoor()
103    {
104        cout<<"Classic Door Create"<<endl;
105    }
106    void doSomething(){    }
107};
108
109class ClassicLight:public Light
110{
111public :
112    ClassicLight()
113    {
114        cout<<"Classic Light Create"<<endl;
115    }
116    void doSomething(){    }
117};
118
119//Factory for Speed Cars
120//对应UML图中的ConcreteFactory1类
121class SpeedFactory:public AbstractFactory
122{
123public:
124    SpeedFactory()
125    {
126        cout<<"SpeedFactory Create"<<endl;
127    }
128    virtual Engine* CreateEngine()
129    {
130        return new SpeedEngine();
131    }
132    virtual Door* CreateDoor() 
133    {
134        return new SpeedDoor();
135    }
136    virtual Light* CreateLight()
137    {
138        return new SpeedLight();
139    }
140};
141
142//Factory for classic Cars
143//对应UML图中的ConcreteFactory2类
144class ClassicFactory:public AbstractFactory
145{
146public:
147    ClassicFactory()
148    {
149        cout<<"ClassicFactory Create"<<endl;
150    }
151    virtual Engine* CreateEngine()
152    {
153        return new ClassicEngine();
154    }
155    virtual Door* CreateDoor() 
156    {
157        return new ClassicDoor();
158    }
159    virtual Light* CreateLight()
160    {
161        return new ClassicLight();
162    }
163};
164
165//Client Code ---- use the Abstract Factory & Abstract Product to create the car
166//this is never changed
167class CarManager
168{
169protected:
170    AbstractFactory *abstractFactory;
171public:
172    //创造Car
173    void createCar(AbstractFactory *abstractFactory)
174    {
175        abstractFactory->CreateEngine();
176        abstractFactory->CreateDoor();
177        abstractFactory->CreateLight();
178    }
179    //其他的操作
180    void run(){}
181};
182
183int _tmain(int argc, _TCHAR* argv[])
184{
185    CarManager *carManager = new CarManager();
186    //创建Classic风格的汽车
187    carManager->createCar(new ClassicFactory());
188
189    return 0;
190}

C++设计模式之二 AbstractFactory模式相关推荐

  1. 虚无空间java下载_Java进阶篇设计模式之二 ----- 工厂模式

    前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...

  2. 一天一种设计模式之二-----备忘录模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.备忘录模式 备忘录模式属于三种设计模式中的行为型模式(另外两种是创建型模式和结构型模式). 定义:在不破坏封闭性的前提下, ...

  3. 乱砍设计模式之二 -- STATE模式

    转自 : http://blog.csdn.net/wishfly/archive/2008/01/22/2060026.aspx STATE模式的中文名称是状态模式.在<设计模式>一书中 ...

  4. 设计模式之二——工厂模式

    1.工厂模式简介 1.1定义 简单工厂模式(Simple Factory Pattern):专门定义一个类(工厂类)来负责创建其他类的实例.可以根据创建方法的参数来返回不同类的实例,被创建的实例通常都 ...

  5. 设计模式之二-Proxy模式

    代理模式 组成: 抽象角色:通过接口或抽象类声明真实角色实现的业务方法. 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. 真实角色:实现抽象 ...

  6. PureMVC(AS3)剖析:设计模式(二)

    PureMVC(AS3)剖析:设计模式(二) 模式 上一篇中介绍了PureMVC中使用的3种设计模式:单例模式.观察者模式.外观模式.本篇将继续介绍剩下的3种设计模式: l  使用中介者(Mediat ...

  7. 设计模式之(三) 构造模式

    前言 离之前的设计模式之(二) 创建者模式的编写有一段时间了. 这部分的内容其实早已经写好. 最近整理出来. 另: 1. 虽都尽量详尽. 但是, 近来回看, 发现书中并不是都对. 也许是个人的理解不同 ...

  8. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  9. 设计模式(二)—— 创建型模式

    设计模式(二)-- 创建型模式 文章首发于 掘金 作者:MiyueFE 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 创建型模式,即处理对象创建过程的设计模式,根据实际情况来使 ...

最新文章

  1. Boost:循环缓冲区迭代的测试程序
  2. 基于机器学习的AI预测更智能?
  3. html div float center,跨浏览器实现float:center
  4. 场景应用题目常见面试真题详解
  5. python requests和urllib_Python——深入理解urllib、urllib2及requests(requests不建议使用?)...
  6. Ubuntu14.04安装与卸载ROS(避坑教程)配kinetic版本安装官方网址
  7. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式
  8. matlab 频率分布直方图_小猿圈Python开发之绘制频率分布直方图示例
  9. 【PL/SQL】 使用游标
  10. rk3288_Android7.1长按recovery按键5s之后恢复出厂设置
  11. 利用卷积神经网络(CNN)提取图片特征
  12. python数据结构之匿名函数lambda
  13. yasm,nasm的关系
  14. mysql数据库解锁
  15. Linux终端解压压缩文件,如何从终端解压zip文件?
  16. mysql 修改 character_set_database_如何将character_set_database latin1 改为 gbk(转)
  17. solr facet查询及solrj 读取facet数据
  18. python下载CVF论文
  19. 华三路由器链路聚合配置(华三交换机配置)
  20. 安装和卸载 MS SQL Server 2012数据库

热门文章

  1. delphi android动态权限,DELPHI安卓动态权限申请
  2. 计算机ip地址配置参数,指定电脑的IP地址和DNS等参数配置方法
  3. mybatis-plus 使用乐观锁修改
  4. 注解和反射实现dao层增删改查
  5. 稠密连接网络(DenseNet)
  6. unix修改服务器时间格式,处理unix中的日期格式
  7. MySQL赋权navicat_mysql 的root 用户无法授权及解决navicat 远程授权提示1044问题
  8. vue基础18(vue-cli脚手架项目中组件的使用)
  9. 【4.0】jdbcTemplate
  10. [剑指offer]面试题第[7]题[JAVA][斐波那契数列][递归]