抽象工厂模式介绍

在上一集的设计模式:工厂方法模式(C++)我们使用工厂方法模式能带来一系列的好处,我们将生成产品的工厂类进行了抽象化,一种产品 用专门的工厂进行生产。我们也知道 当产品种类特别多的时候 我们的工厂类会变的非常的多 ,产品有多少种,那么我们生成对应产品的工厂列就有多少种!难度没有更好一点的办法么?当然有嘛,有更好的设计模式来解决这个问题嘛。试想一下 一个工厂难道就只能生成一种产品?当然不是,可以生产一系列的产品。那么我们就可以进一步的抽象,工厂能够生成一系列的产品。

我们的抽象工厂模式 就是将工厂进行抽象 ,但是它是生产一系列的产品 ,它是针对产品族的!产品 对应的有多个产品系列。比如说我们以汽车工厂举例,抽象的汽车工厂可以生产宝马车、奔驰车、哈弗车。我们的具体工厂->中国工厂生产 国产宝马、国产奔驰、国产哈弗 这一系列的产品。宝马产品族 可以有 国产宝马、日产宝马、美国产的宝马。请看下面的模型图。

抽象工厂模式模型图

抽象工厂模式代码

Car.h 汽车类相关代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//宝马汽车基类 抽象宝马车
class BMWCar
{
public:BMWCar(string name){this->name = name;}virtual void run() = 0;//纯虚函数void setName(string name){this->name = name;}string getName(){return this->name;}
private:string name;
};
//奔驰汽车基类 抽象奔驰车
class BenzCar
{
public:BenzCar(string name){this->name = name;}virtual void run() = 0;//纯虚函数void setName(string name){this->name = name;}string getName(){return this->name;}
private:string name;
};
//哈弗汽车基类 抽象哈弗车
class HavalCar
{
public:HavalCar(string name){this->name = name;}virtual void run() = 0;//纯虚函数void setName(string name){this->name = name;}string getName(){return this->name;}
private:string name;
};
//国产宝马
class ChinaBMW :public BMWCar
{
public:ChinaBMW(string name) :BMWCar(name){}void run(){cout << this->getName() << "已经启动。" << "国产宝马汽车欢迎您。" << endl;}
};
//国产奔驰
class ChinaBenz :public BenzCar
{
public:ChinaBenz(string name) :BenzCar(name){}void run(){cout << this->getName() << "已经启动。" << "国产奔驰汽车欢迎您。" << endl;}
};
//国产哈弗
class ChinaHaval :public HavalCar
{
public:ChinaHaval(string name) :HavalCar(name){}void run(){cout << this->getName() << "已经启动。" << "国产哈弗汽车欢迎您。" << endl;}
};
//美国宝马
class AmericaBMW :public BMWCar
{
public:AmericaBMW(string name) :BMWCar(name){}void run(){cout << this->getName() << "已经启动。" << "美国宝马汽车欢迎您。" << endl;}
};
//美国奔驰
class AmericaBenz :public BenzCar
{
public:AmericaBenz(string name) :BenzCar(name){}void run(){cout << this->getName() << "已经启动。" << "美国奔驰汽车欢迎您。" << endl;}
};
//美国哈弗
class AmericaHaval :public HavalCar
{
public:AmericaHaval(string name) :HavalCar(name){}void run(){cout << this->getName() << "已经启动。" << "美国哈弗汽车欢迎您。" << endl;}
};
//小日本造的宝马
class JapanBMW :public BMWCar
{
public:JapanBMW(string name) :BMWCar(name){}void run(){cout << this->getName() << "已经启动。" << "小日本造的宝马汽车欢迎您。" << endl;}
};
//小日本造的奔驰
class JapanBenz :public BenzCar
{
public:JapanBenz(string name) :BenzCar(name){}void run(){cout << this->getName() << "已经启动。" << "小日本造的奔驰汽车欢迎您。" << endl;}
};
//小日本造的哈弗
class JapanHaval :public HavalCar
{
public:JapanHaval(string name) :HavalCar(name){}void run(){cout << this->getName() << "已经启动。" << "小日本造的哈弗汽车欢迎您。" << endl;}
};

AbstractFactory.cpp 抽象工厂代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include "03 Car.h"
using namespace std;
/*
抽象工厂模式 针对的是产品族
每个具体的工厂 将生成不同系列的产品
*/
class AbstractCarFactory
{
public:virtual BMWCar* CreateBMWCar() = 0;//纯虚函数virtual BenzCar* CreateBenzCar() = 0;virtual HavalCar* CreateHavalCar() = 0;
};
//中国工厂 在中国生产的系列产品
class ChinaCarFactory :public AbstractCarFactory
{
public:BMWCar* CreateBMWCar(){return new ChinaBMW("中国宝马");}BenzCar* CreateBenzCar(){return new ChinaBenz("中国奔驰");}HavalCar* CreateHavalCar(){return new ChinaHaval("中国哈佛");}
};
//美国工厂
class AmericaCarFactory :public AbstractCarFactory
{
public:BMWCar* CreateBMWCar(){return new AmericaBMW("美国牌宝马");}BenzCar* CreateBenzCar(){return new AmericaBenz("美国牌奔驰");}HavalCar* CreateHavalCar(){return new AmericaHaval("美国牌哈佛");}
};
//日本工厂
class JapanCarFactory :public AbstractCarFactory
{
public:BMWCar* CreateBMWCar(){return new JapanBMW("小日本造宝马");}BenzCar* CreateBenzCar(){return new JapanBenz("小日本造奔驰");}HavalCar* CreateHavalCar(){return new JapanHaval("小日本造哈佛");}
};
int main(int argc, char *argv[])
{AbstractCarFactory *chinaFactroy = new ChinaCarFactory();AbstractCarFactory *americaFactroy = new AmericaCarFactory();AbstractCarFactory *japanFactroy = new JapanCarFactory();//中国工厂生产的系列汽车BMWCar* chinaBMW  = chinaFactroy->CreateBMWCar();BenzCar* chinaBenz = chinaFactroy->CreateBenzCar();HavalCar* chinaHaval = chinaFactroy->CreateHavalCar();//美国工厂生产的系列汽车BMWCar* americaBMW = americaFactroy->CreateBMWCar();BenzCar* americaBenz = americaFactroy->CreateBenzCar();HavalCar*americaHaval = americaFactroy->CreateHavalCar();//小日本工厂生产的系列汽车BMWCar* japanBMW = japanFactroy->CreateBMWCar();BenzCar* japanBenz = japanFactroy->CreateBenzCar();HavalCar*japanHaval = japanFactroy->CreateHavalCar();//汽车跑起来。。。chinaBMW  ->run();chinaBenz ->run();chinaHaval->run();americaBMW->run();americaBenz->run();americaHaval->run();japanBMW->run();japanBenz->run();japanHaval->run();return EXIT_SUCCESS;
}

代码运行结果

设计模式:抽象工厂模式(C++)【工厂方法升级】相关推荐

  1. 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

    声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...

  2. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  3. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

    园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...

  4. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...

  5. 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解

    工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...

  6. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  7. C++设计模式 | 四种创建型模式——简单工厂模式、工厂方法模式、抽象工厂模式、单例模式...

    简单工厂模式 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespa ...

  8. JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式】

    目录 简单工厂模式 传统方式 简单工厂模式 静态工厂模式 工厂方法模式 抽象工厂模式 工厂模式JDK-Calendar源码分析 工厂模式小结 简单工厂模式   看一个具体的需求 看一个披萨的项目:要便 ...

  9. 深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解

    文章目录 前言 一.简单工厂模式 1.描述 2.特点 3.优缺点 4.类图说明 二.工厂方法模式 1.描述 2.特点 3.适用场景 4.类图说明 5.简单工厂模式与工厂方法模式区别: 三.抽象工厂模式 ...

  10. 设计模式之工厂模式(工厂方法模式 和 抽象工厂模式)

    工厂模式的概念 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式. 工厂模式包括工厂方法模式和抽象工厂模式.抽象工厂模式是工厂方法模式的扩展. 工厂方法模式的实现步骤如下: ...

最新文章

  1. UIView层次管理(sendSubviewToBack,bringSubviewToFront)
  2. ajax回调函数ifelse,实现AJAX及用Promise解决回调函数命名问题
  3. git使用的基本流程_这 7 个免费的 Git 教程,适合所有程序员
  4. android 线性布局 底部,java – 如何在android线性布局中对齐父底部?
  5. 吴恩达《Machine Learning》精炼笔记 10:异常检测
  6. 05-WIFI通讯客户端搭建
  7. java access dbq 参数_Java怎么连接access数据库,要求讲解详细一些
  8. ​你可能不知道的7个HTML小技巧
  9. 用ajax传值input file,获取 input type=file 标签的内容,并使用ajax进行请求到服务器...
  10. 小米手机上安装https证书(例如pem证书,crt证书)详解
  11. ntp-redhat 同步时间配置
  12. SpringMvc01 第一个Springmvc应用
  13. 蓝桥杯 ALGO31 算法训练 开心的金明 java版
  14. 点对点信道互连以太网实验_轩辕实验室┃SOTIF:汽车以太网容错能力测试(1)...
  15. GPS卫星定位基本原理
  16. 微信扫一扫登录(使用小程序实现)
  17. 计算机专业专硕考研数学考一还是二,计算机专业考研数学考一还是二
  18. android导出微信朋友圈怎么发文字,微信朋友圈气泡字怎么弄 微信朋友圈气泡文字生成教程...
  19. 计算机程序漏洞用英语怎么说,安全漏洞的英文
  20. 什么是信息流?如何投放信息流广告?如何收费?

热门文章

  1. AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac
  2. macOS Big Sur怎么样?值得升级吗?Big Sur与Catalina的对比
  3. P1425 小鱼的游泳时间(python3实现)
  4. 微信小程序隐藏菜单栏目下转发按钮的几个方法
  5. jquery在当前页面打印页面div内容实例
  6. 平衡二叉树平衡因子怎么计算_数据结构PHP 平衡二叉树(AVL)的平衡原理
  7. plaintextedit指定一行一行的高亮显示_LED显示器常见芯片的作用及原理,故障诊断维修...
  8. ThinkPHP6项目基操(1.环境搭建及ThinkPHP6的安装)
  9. C/C++ OpenCV之Sobel边缘检测
  10. 32岁妈妈适合转行做软件测试吗,32+大龄妈妈,AMH偏低,可丽蓝助力好孕一次就中...