C++设计模式-抽象工厂(Abstract Factory)

news2024/11/18 17:27:45

目录

C++设计模式-抽象工厂(Abstract Factory)

一、意图

二、适用性

三、结构

四、参与者

五、代码


C++设计模式-抽象工厂(Abstract Factory)

一、意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

二、适用性

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

三、结构

 

四、参与者

  • AbstractFactory

       声明一个创建抽象产品对象的操作接口。

  • ConcreteFactory

        实现创建具体产品对象的操作。

  • AbstractProduct

        为一类产品对象声明一个接口。

  • ConcreteProduct

        定义一个将被相应的具体工厂创建的产品对象。

        实现AbstractProduct接口。

  • Client

        仅使用由AbstractFactory和AbstractProduct类声明的接口。

五、代码

#include<iostream>
using namespace std;

class AbstractProduct {
public:
	virtual void ShowInformation() = 0;
};

class AbstractProductA : public  AbstractProduct {};

class ProductA1 : public AbstractProductA {
public:
	void ShowInformation() {
		cout << "ProductA1 Information" << endl;
	}
};

class ProductA2 : public AbstractProductA {
public:
	void ShowInformation() {
		cout << "ProductA2 Information" << endl;
	}
};

class AbstractProductB : public  AbstractProduct {};

class ProductB1 : public AbstractProductB {
public:
	void ShowInformation() {
		cout << "ProductB1 Information" << endl;
	}
};

class ProductB2 : public AbstractProductB {
public:
	void ShowInformation() {
		cout << "ProductB2 Information" << endl;
	}
};

class AbstractFactory {
public:
	virtual AbstractProductA* CreateProductA() = 0;
	virtual AbstractProductB* CreateProductB() = 0;
};

class FactoryOne : public  AbstractFactory {
public:
	AbstractProductA* CreateProductA() {
		return new ProductA1;
	}
	AbstractProductB* CreateProductB() {
		return new ProductB1;
	}
};

class FactoryTwo : public  AbstractFactory {
public:
	AbstractProductA* CreateProductA() {
		return new ProductA2;
	}
	AbstractProductB* CreateProductB() {
		return new ProductB2;
	}
};

int main() {

	AbstractFactory* factoryOne = new FactoryOne;
	AbstractProduct* productA1 = factoryOne->CreateProductA();
	AbstractProduct* productB1 = factoryOne->CreateProductB();
	productA1->ShowInformation();
	productB1->ShowInformation();

	AbstractFactory* factoryTwo = new FactoryTwo;
	AbstractProduct* productA2 = factoryTwo->CreateProductA();
	AbstractProduct* productB2 = factoryTwo->CreateProductB();
	productA2->ShowInformation();
	productB2->ShowInformation();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity脚本_生命周期函数 c#

帧&#xff1a;fps 即每秒钟跑的游戏帧数 游戏的本质 是一个死循环 每一次循环处理游戏逻辑就会更新一次画面 之所以能看到画面在动 是因为切换画面的速度达到一定时人眼就认为画面时流畅的 一帧就是执行一次循环 人眼舒适放松时可视帧数 24帧/s 游戏卡顿的原因&#xff1a; …

C 语言的标识符,保留标识符,关键字

C99 和 C11 允许使用更长的标识符&#xff08;identifier&#xff09;&#xff0c;但是编译器只能识别前 63 个字符&#xff0c;对于外部标识符&#xff0c;只允许使用 31 个字符。 实际上&#xff0c;可以使用更长的字符&#xff0c;但是编译器会忽略超出部分的字符。 如果两…

Stack和quque

102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 如图&#xff1a;层序遍历即一层一层遍历&#xff0c;从左到右。 先遍历第一层&#xff0c;把第一层的节点放到队列里面&#xff0c;levesizeq.size()&#xff0c;即代表队列里面有多少个值。 然后现在把队里里…

笔试编程ACM模式JS(V8)、JS(Node)框架、输入输出初始化处理、常用方法、技巧

目录 考试注意事项 先审完题意&#xff0c;再动手 在本地编辑器&#xff08;有提示&#xff09; 简单题515min 通过率0%&#xff0c;有额外log 常见输入处理 str-> num arr&#xff1a;line.split( ).map(val>Number(val)) 初始化数组 new Array(length).fill(v…

windows terminal终端美化

1&#xff0c;安装Windows terminal 可以选择window商店安装或者GitHub安装&#xff0c;安装步骤省略。 2.oh my posh 安装 安装步骤可以选择window 商店或者GitHub安装&#xff0c;步骤省略 3.安装字体 nerd font[官网链接] 4.配置 oh my posh ####第一次要输入以下命…

视频号规则改动,不再支持拍单,传统无货源模式已行不通!

视频号小店批量铺货行不通了&#xff0c;大家好我是派大星&#xff0c;这两天视频号发布了一个公告&#xff0c; 核心信息呢就是10月7号&#xff0c;视频号小店&#xff0c;将无法直接查看消费者的详细下单信息&#xff0c;只能通过电子面单的形式&#xff0c;打单发货。每个店…

RDP协议流程详解(二)Basic Settings Exchange 阶段

RDP连接建立过程&#xff0c;在Connection Initiation后&#xff0c;RDP客户端和服务端将进行双方基础配置信息交换&#xff0c;也就是basic settings exchange阶段。在此阶段&#xff0c;将包含两条消息Client MCS Connect Initial PDU和Server MCS Connect Response PDU&…

vulnhub靶机doubletrouble

下载地址&#xff1a;doubletrouble: 1 ~ VulnHub 主机发现 arp-scan -l 端口扫描 nmap --min-rate 1000 -p- 192.168.21.151 端口服务扫描 nmap -sV -sT -O -p22,80 192.168.21.151 漏洞扫描 nmap --scriptvuln -p22,80 192.168.21.151 先去看看web页面 这里使用的是qdpm …

【JavaEE重点知识归纳】第5节:方法

目录 一&#xff1a;方法的概念和使用 1.什么是方法 2.方法的定义 3.方法的调用过程 4.实参和形参的关系&#xff08;重点&#xff09; 二:方法重载 1.方法重载概念 2.方法签名 三&#xff1a;递归 1.递归的概念 2.递归执行的过程分析 一&#xff1a;方法的概念和使…

HttpStatusCodeException.getResponseBodyAsString 乱码

场景: 项目a进行了spring boot版本升级, 使用了2.7.15 项目b是做接口转发 (没升级spring boot版本, 用的是2.1.5) 调用过程: 请求方>>项目b>>项目a 现象: postman直接调用a中的接口, 接口报错, msg里的错误信息是正常显示 当调用接口报错时, msg里的错误信息是…

算法笔记:0-1背包问题

n个商品组成集合O&#xff0c;每个商品有两个属性vi&#xff08;体积&#xff09;和pi&#xff08;价格&#xff09;&#xff0c;背包容量为C。 求解一个商品子集S&#xff0c;令 优化目标 1. 枚举所有商品组合 共2^n - 1种情况 2. 递归求解 KnapsackSR(h, i, c)&#xff…

Vue中如何进行数据可视化雷达图展示

在Vue中进行数据可视化雷达图展示 数据可视化是将数据以图形方式呈现的过程&#xff0c;雷达图是其中一种常用的图表类型&#xff0c;用于可视化多个维度的数据。Vue.js作为一个流行的JavaScript框架&#xff0c;提供了许多工具和库来实现数据可视化。本文将介绍如何使用Vue来…

git与github的交互(文件与文件夹的上传)

git与github的交互&#xff08;文件与文件夹的上传&#xff09; 准备&#xff1a;gitHub账号&#xff08;创建一个新项目&#xff09;与Git软件的安装 一&#xff1a;开启公钥SSH登录&#xff08;之前配置过就跳过&#xff09; 1.安装SSH 在本地新创建文件夹负责装载项目&a…

Java虚拟机内存模型

JVM虚拟机将内存数据分为&#xff1a; 程序计数器、虚拟机栈、本地方法栈、Java堆、方法区等部分。 程序计数器用于存放下一条运行的指令&#xff1b; 虚拟机栈和本地方法栈用于存放函数调用堆栈信息&#xff1b; Java堆用于存放Java程序运行时所需的对象等数据&#xff1b…

桌面应用开发:Go 语言和 Web 技术的融合创新 | 开源日报 No.46

TheAlgorithms/Python Stars: 161.5k License: MIT 这个开源项目是一个用 Python 实现的算法库&#xff0c;旨在提供教育目的下使用的各种算法。 提供了大量常见算法的 Python 实现。适合学习和教育目的&#xff0c;可以帮助读者更好地理解不同类型的算法。 airbnb/javascri…

AI:08-基于深度学习的车辆识别

随着汽车行业的迅速发展,车型识别在交通管理、智能驾驶和车辆安全等方面变得越来越重要。基于深度学习的车型识别技术为实现高效准确的车辆分类和检测提供了强大的工具。本文将介绍如何利用深度学习技术来实现车型识别,并提供相应的代码示例。 数据收集和预处理: 为了训练…

PHP 行事准则:PHP 配置文件

文章目录 参考环境PHP 行事准则PHP 配置文件php.ini-production 与 php.ini-development生产配置文件开发配置文件配置文件的应用版本差异 修改配置的生效 PHP 运行时配置ini_set()布尔配置项限制 phpinfo()phpinfo 页面Core 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一…

软件设计师学习笔记11-磁盘管理+IO管理软件+文件管理+作业管理

目录 1.磁盘管理 1.1磁盘(了解一下) 1.2读取磁盘数据的时间 1.3 磁盘调度算法 1.3.1常见的磁盘调度 1.3.2 先来先服务(FCFS) 1.3.3 最短寻道时间优先(SSTF) 1.4 例题补充(均来自希赛软考) 1.4.1 单/双缓冲区花销时间的计算 1.4.2 SSTF 1.4.3 磁道物理块花销时间计算…

UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】

目录 需要考虑的问题 重定向的修复函数 代码&#xff1a; 删除无引用资产 代码 需要添加的头文件和模块 在我们删除资产的时候&#xff0c;会发现&#xff0c;有些资产在删除的时候会出现有被什么什么引用&#xff0c;还有的是没有被引用。 而我们如果直接选择一片去进行…

Qt的WebEngineView加载网页时出现Error: WebGL is not supported

1.背景 当我在qml中使用WebEngineView加载一个网页时&#xff0c;出现以下错误&#xff1a; Error: WebGL is not supported 2.解决方案 其实这个问题在Qt的帮助文档中已经提及了解决办法&#xff1a; 因此&#xff0c;可以按照下面的步骤操作一下&#xff1a; 2.1.pro文件 …