设计模式:抽象工厂模式(C++)【工厂方法升级】
抽象工厂模式介绍
在上一集的设计模式:工厂方法模式(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++)【工厂方法升级】相关推荐
- 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...
- 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)
园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...
- 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解
工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...
- C++设计模式 | 四种创建型模式——简单工厂模式、工厂方法模式、抽象工厂模式、单例模式...
简单工厂模式 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespa ...
- JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式】
目录 简单工厂模式 传统方式 简单工厂模式 静态工厂模式 工厂方法模式 抽象工厂模式 工厂模式JDK-Calendar源码分析 工厂模式小结 简单工厂模式 看一个具体的需求 看一个披萨的项目:要便 ...
- 深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解
文章目录 前言 一.简单工厂模式 1.描述 2.特点 3.优缺点 4.类图说明 二.工厂方法模式 1.描述 2.特点 3.适用场景 4.类图说明 5.简单工厂模式与工厂方法模式区别: 三.抽象工厂模式 ...
- 设计模式之工厂模式(工厂方法模式 和 抽象工厂模式)
工厂模式的概念 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式. 工厂模式包括工厂方法模式和抽象工厂模式.抽象工厂模式是工厂方法模式的扩展. 工厂方法模式的实现步骤如下: ...
最新文章
- UIView层次管理(sendSubviewToBack,bringSubviewToFront)
- ajax回调函数ifelse,实现AJAX及用Promise解决回调函数命名问题
- git使用的基本流程_这 7 个免费的 Git 教程,适合所有程序员
- android 线性布局 底部,java – 如何在android线性布局中对齐父底部?
- 吴恩达《Machine Learning》精炼笔记 10:异常检测
- 05-WIFI通讯客户端搭建
- java access dbq 参数_Java怎么连接access数据库,要求讲解详细一些
- ​你可能不知道的7个HTML小技巧
- 用ajax传值input file,获取 input type=file 标签的内容,并使用ajax进行请求到服务器...
- 小米手机上安装https证书(例如pem证书,crt证书)详解
- ntp-redhat 同步时间配置
- SpringMvc01 第一个Springmvc应用
- 蓝桥杯 ALGO31 算法训练 开心的金明 java版
- 点对点信道互连以太网实验_轩辕实验室┃SOTIF:汽车以太网容错能力测试(1)...
- GPS卫星定位基本原理
- 微信扫一扫登录(使用小程序实现)
- 计算机专业专硕考研数学考一还是二,计算机专业考研数学考一还是二
- android导出微信朋友圈怎么发文字,微信朋友圈气泡字怎么弄 微信朋友圈气泡文字生成教程...
- 计算机程序漏洞用英语怎么说,安全漏洞的英文
- 什么是信息流?如何投放信息流广告?如何收费?
热门文章
- AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac
- macOS Big Sur怎么样?值得升级吗?Big Sur与Catalina的对比
- P1425 小鱼的游泳时间(python3实现)
- 微信小程序隐藏菜单栏目下转发按钮的几个方法
- jquery在当前页面打印页面div内容实例
- 平衡二叉树平衡因子怎么计算_数据结构PHP 平衡二叉树(AVL)的平衡原理
- plaintextedit指定一行一行的高亮显示_LED显示器常见芯片的作用及原理,故障诊断维修...
- ThinkPHP6项目基操(1.环境搭建及ThinkPHP6的安装)
- C/C++ OpenCV之Sobel边缘检测
- 32岁妈妈适合转行做软件测试吗,32+大龄妈妈,AMH偏低,可丽蓝助力好孕一次就中...