c++设计模式--抽象工厂(abstract factory)
一、原理讲解
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
1.1意图
定义一个创建对象的接口,让子类决定实例化哪个类。该模式使类对象的创建延迟到子类。
1.2应用场景
一个系统要独立于它的产品的创建、组合和表示时;
一个系统要由多个产品系列中的一个来配置时;
当你要强调一系列相关的产品对象的设计以便进行联合使用时;
当你提供一个产品类库,而只想显示他们的接口而不是实现时;
1.3结构图(UML图)
1.4代码实现步骤
a1 定义一个抽象产品接口类IProduct,并且定义一个接口函数show()用于子类继承;(抽象产品类)
a2 定义两个实现接口类IProductA和IProductB,都重写接口函数show();(具体产品类)
a3 定义一个抽象接口工厂类IFactory,并且定义两个对象创建函数createProduct1,createProduct2,唯一目的是被子类继承重写;(抽象工厂类)
a4 定义两个具体工厂类FactoryA和FactoryB,重写接口函数createProduct并且返回对应的产品类对象。(具体产品类)
二、实现代码
AbstractFactory.cpp
#include<iostream>using namespace std;#define DELETE(pointer) delete pointer; pointer=nullptrclass IProduct //抽象产品
{public:IProduct() {}virtual ~IProduct() {}virtual void show() = 0;
};class ProductA1 : public IProduct //具体产品A
{public:ProductA1() {}~ProductA1() {}virtual void show() { cout << "ProductA1" << endl; }
};class ProductA2 : public IProduct //具体产品A
{public:ProductA2() {}~ProductA2() {}virtual void show() { cout << "ProductA2" << endl; }
};class ProductB1 : public IProduct //具体产品B
{public:ProductB1() {}~ProductB1() {}virtual void show() { cout << "ProductB1" << endl; }
};class ProductB2 : public IProduct //具体产品B
{public:ProductB2() {}~ProductB2() {}virtual void show() { cout << "ProductB2" << endl; }
};class IFactory //抽象工厂
{public:IFactory() {}virtual ~IFactory() {}virtual IProduct* createProduct1() = 0;virtual IProduct* createProduct2() = 0;
};class FactoryA : public IFactory //具体工厂A
{public:FactoryA() {}virtual ~FactoryA() {}IProduct* createProduct1() override { return new ProductA1; }IProduct* createProduct2() override { return new ProductA2; }
};class FactoryB : public IFactory //具体工厂B
{public:FactoryB() {}virtual ~FactoryB() {}IProduct* createProduct1() override { return new ProductB1; }IProduct* createProduct2() override { return new ProductB2; }
};void doAbstractFactory()
{//生产产品A系列(A1,A2)IFactory *factory = new FactoryA();IProduct *product1 = factory->createProduct1();IProduct *product2 = factory->createProduct1();product1->show();product2->show();DELETE(product1);DELETE(product2);DELETE(factory);//生产产品B系列(B1,B2)factory = new FactoryB();product1 = factory->createProduct1();product2 = factory->createProduct2();product1->show();product2->show();DELETE(product1);DELETE(product2);DELETE(factory);
}
main.cpp
#include <iostream>extern void doAbstractFactory();int main()
{doAbstractFactory();system("pause");return 1;
}
三、总结
3.1原理总结(跟工厂方法对比)
抽象工厂可以说是工厂方法的改进或者集合。抽象工厂可以生产一种产品的一个系列,也就是如果有要生产多个产品,则每个产品都有对应的系列产品。比如上面代码的要生产产品A和产品B,然后产品A有系列A1和系列A2,产品B有系列B1和B2,这时就可以用抽象工厂方法了。
3.2代码总结(跟工厂方法对比)
抽象工厂实现代码主要是在工厂方法的基础上进行改进,修改核心是在抽象工厂IFactory里增加一个产品创建接口void createProduct2()=0即可,接着对应产品A 和产品B分别拥有自己的系列产品类A1、A2,B1、B2,然后跟工厂方法一样用具体工厂来创建产品对象。
四、参考内容:
抽象工厂代码(参考:代码实现)
陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!)
Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:
c++设计模式--抽象工厂(abstract factory)相关推荐
- 设计模式--抽象工厂(Abstract Factory)模式
模式定义 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 类图 应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时可以使用抽象工厂模式 优点 1.可以 ...
- 设计模式 抽象工厂(Abstract Factory Pattern)
抽象工厂模式,比工厂模式具有更高层次的抽象.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以使用这种模式.换句话说,抽象工厂是一个工厂对象,他能返回一系列相关类中的一个类.可 ...
- 设计模式学习笔记——抽象工厂(Abstract Factory)模式
设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...
- [设计模式-创建型]抽象工厂(Abstract Factory)
概括 名称 Abstract Factory 结构 动机 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...
- 《研磨设计模式》chap7 抽象工厂 Abstract Factory
场景:配电脑,多种CPU.主板 1. 正常编码 1.1 cpu //CPU的接口 public interface CPUApi {//示意方法,CPU具有运算的功能 public void calc ...
- C2:抽象工厂 Abstract Factory
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种"封装机制"来避免客户程序和这种"多系列具 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 详解
抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...
- java抽象工厂模式_JAVA设计模式-抽象工厂模式
定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...
- 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)
[JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...
最新文章
- 信阳学院大一计算机考试题库,韩山师范学院大一计算机考试题库网页制作的试题...
- 红帽论坛北京站召开 设立亚太开放创新实验室
- Linux内核 - tcp发送数据从应用到驱动经历的函数调用
- 如何使用 PTS 快速发起微服务压测
- jQuery【学习心得】简介和选择器
- 安装后jdk1.8 配置环境变量以后 版本显示还是1.7
- MMSegmentation:标准统一的语义分割框架
- 超酷炫粒子背景插件—particles.js
- 复旦微电子fpga数据手册_牛眼IPO | 复旦微闯关科创板:主要产品售价走低、晶圆成本却在上升...
- Qzone高性能HTTPS实践
- android悬浮窗语音识别demo
- Win11截图键无法使用怎么办?Win11截图键无法使用的解决方法
- Axure RP 9操作界面介绍【教程一】
- 睡眠伤害计算机硬件吗,电脑高手告诉您,电脑不关机只睡眠到底伤不伤硬盘?...
- [转载] OpenCV—利用回调函数实现返回鼠标点击位置的坐标和灰度值
- 2022-2028年中国长租公寓行业市场运行格局及发展策略分析报告
- Mozilla5.0的意思
- 23位子网掩码是多少_子网掩码23位的是多少
- FreeSWITCH软电话互打
- 国家强制性产品认证实施规则汇总(更新日期:2020年12月)
热门文章
- VMware厚置备延迟置零,厚置备置零,精简置备详解
- Android 实现app的版本升级(迭代)
- oracle的nvl的使用,oracle的nvl函数的使用介绍
- 视通科技AS-VMS军警指挥调度解决方案
- Java的jdk安装教程:
- 香肠派对服务器维护时间,怎么解除香肠派对时间限制_怎么解除香肠派对健康保护时间限制_资讯...
- 最优服务次序问题算法c语言,《算法分析与设计》最优服务次序问题的答案-20210414020541.docx-原创力文档...
- 钥匙串显示发布证书不受信任解决办法
- 【学习笔记】SpringAOP的用法全解
- php没有mysql_connect()_【在线等】php不能连接mysql?提示:Warning: mysql_connect() 。。。...