23种设计模式——工厂方法模式

定义:

一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。

工厂方法通用类图:

这个图更好理解

在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creator为抽象创建类,也是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。

工厂方法模式的应用

工厂方法模式的优点

良好的封装新,代码结构清晰。一个对象创建是有约束条件的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或者约束字符串)就可以了,不知奥创建对象的艰辛过程,降低模块间的耦合。

工厂方法模式是经典的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心。符合迪米特法则,我不需要就不要去交流;也符合依赖倒置原则,只依赖产品的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类。

#include <iostream>

using namespace std;
class Product
{
public:
	virtual void show() = 0;
};
class Factory
{
public:
	virtual Product* CreateProduct() = 0;
};
class ProductA : public Product
{
public:
	void show()
	{
		cout << "I'm ProductA" << endl;
	}
};
class ProductB : public Product
{
public:
	void show()
	{
		cout << "I'm ProductB" << endl;
	}

};
class FactoryA : public Factory
{
public:
	Product* CreateProduct()
	{
		return new ProductA();
	}
};
class FactoryB : public Factory
{
public:
	Product* CreateProduct()
	{
		return new ProductB();
	}
};
int main()
{
	Factory* factoryA = new FactoryA();
	Factory* factoryB = new FactoryB();

	Product* productA = factoryA->CreateProduct();
	Product* productB = factoryB->CreateProduct();

	productA->show();
	productB->show();

	if (factoryA != nullptr)
	{
		delete factoryA;
		factoryA = nullptr;
	}
	if (factoryB != nullptr)
	{
		delete factoryB;
		factoryB = nullptr;
	}
	if (productA != nullptr)
	{
		delete productA;
		productA = nullptr;
	}
	if (productB != nullptr)
	{
		delete productB;
		productB = nullptr;
	}
	return 0;
}

参考:C++设计模式——工厂方法模式 - Ring_1992 - 博客园 (cnblogs.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无公网ip环境使用DS file软件远程访问内网群晖NAS中储存的文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用程序具有…

【C++从练气到飞升】01---C++入门

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 推荐 前言 什么是C C的发展史 &#x1f4cb;命名空间 命名空间定义 命名空间使用 命名空间的嵌套 std命名空间的使用 &#…

JavaScript-如何通过原生JS实现匀速动画

JavaScript-如何通过原生JS实现匀速动画 据我们所知&#xff0c;我们可以通过css3&#xff08;transform translate即可&#xff09;区实现这个动画&#xff0c;但是通常面试的时候&#xff0c;可能会被要求原生手敲&#xff1b; ​ 使用到的知识点&#xff1a;定时器去实现s…

力扣hot4--双指针

题目&#xff1a; 双指针想法&#xff1a; i 指针在数组不为 0 的地方停留&#xff0c;j 指针在每个地方停留&#xff0c;依次交换 i 和 j 指针。当 i 指针遍历完所有数组元素时&#xff0c;j 指针指向的元素及后面的元素都为0。 代码如下&#xff1a; C版本 class Solution …

5.测试教程 - 进阶篇

文章目录 1.按测试对像划分1.1**界面测试**1.2**可靠性测试**1.3**容错性测试**1.4**文档测试**1.5**兼容性测试**1.6**易用性测试**1.7**安装卸载测试**1.8**安全测试**1.9**性能测试**1.10**内存泄漏测试** 2.按是否查看代码划分2.1黑盒测试(Black-box Testing)2.2白盒测试(W…

retinaNet FocalLoss源码详解

targets[positive_indices, assigned_annotations[positive_indices, 4].long()] 1 ## 把正样本所对应的锚框所对应的类别的列置为1 # aim torch.randint(0, 1, (1, 80)) # tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # 0…

【JavaEE进阶】使用云服务器实现Linux环境搭建

文章目录 &#x1f343;前言&#x1f332;Linux背景知识&#x1f6a9;Linux 是什么&#xff1f;&#x1f6a9;Linux发行版&#x1f6a9;Linux的优势 &#x1f384;Linux环境搭建&#x1f6a9;环境的搭建方式&#x1f6a9;使用云服务器 &#x1f38b;使用终端软件连接到Linux&am…

企业CRM系统选型指南 | 掌握必备功能,提升工作效率

大家好我是卡林&#xff0c;今天分享CRM系统的十大功能&#xff0c;企业CRM系统选型指南。说起CRM的功能&#xff0c;大家会联想到什么&#xff1f;数据库、商机管理或者销售漏斗&#xff0c;这些是大部分人都会联想到的功能&#xff0c;但不太全面。如线索管理、联系人管理、客…

2. vue 工程创建

1. 基于 vite创建 官方文档: https://v3.cn.vuejs.org/guide/installation.html#vite vite官网: https://vitejs.cn 使用vite创建的优势&#xff1a; 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动。轻量快速的热重载(HMR)。真正的按需编译&#xff0c;不再…

[青少年CTF擂台挑战赛 2024 #Round] Misc 1ez_model

[青少年CTF擂台挑战赛 2024 #Round] Misc 1ez_model 题目描述&#xff1a;从Pytorch开始的AI之路 下载附件&#xff0c;是一个pth文件 .pth 文件通常是 PyTorch 模型的权重文件&#xff0c;它包含了模型的参数。要还原&#xff08;或加载&#xff09;一个大模型&#xff0c;你…

利用ArcGISPro/GeoScenePro从激光雷达数据中提取 3D 建筑物

开始使用激光雷达数据 在本课程中&#xff0c;您将从激光雷达数据中提取信息。 激光雷达&#xff08;激光探测及测距&#xff09;是一项遥感技术&#xff0c;它利用激光对地球表面进行密集采样&#xff0c;以产生高精度的 x, y, z 点测量。 这些点的集合称为点云。 要从激光雷达…

CVE-2024-23334 AIOHTTP 目录遍历漏洞复现

aiohttp简介 aiohttp 是一个基于 asyncio 实现的 Python HTTP 客户端和服务器框架。它提供了异步的 HTTP 客户端和服务器功能&#xff0c;能够处理高并发的网络请求。以下是关于 aiohttp 的一些重要特点和用途&#xff1a; 基于 asyncio&#xff1a;aiohttp 是基于 Python 的 a…

FAST-LIO系列-阅读笔记

近期&#xff0c;阅读了FAST-LIO、FAST-LIO2以及Faster_LIO论文&#xff0c;这三篇论文都属于滤波器的SLAM算法&#xff0c;下面记录一下三个工作的主要贡献和不同。 FAST-LIO 1.提出了一种计算效率高、鲁棒性强的激光雷达-惯性里程测量框架。使用紧密耦合的迭代扩展卡尔曼滤…

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 2024年01月03日 10:38186浏览 3喜欢 0评论 视频地址&#xff1a; SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 好想 特征点匹配&#xff0c;为了计算位姿 特征点&#xff1a;关键点描述子&#xff08…

迅速上手:CentOS 系统下 SSH 服务配置指南

前言 掌握 SSH 服务&#xff0c;就像拥有了一把解锁网络世界的钥匙。本文深入浅出地介绍了如何使用 SSH&#xff08;Secure Shell&#xff09;服务&#xff0c;从连接远程服务器到安全文件传输&#xff0c;让你轻松驾驭远程管理与数据传输&#xff0c;提高工作效率&#xff0c…

玩转地下管网三维建模:MagicPipe3D系统

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进&#xff0c;构建地下管网三维模型与地上融合的数字孪生场景&#xff0c;对于提升智慧城市管理至关重要&#xff01;针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

力扣 第 387 场周赛 解题报告 | 珂学家 | 离散化树状数组 + 模拟场

前言 整体评价 手速场模拟场&#xff0c;思路和解法都蛮直接的。 所以搞点活 如果T2&#xff0c;如果不固定左上角&#xff0c;批量查询某个点为左上角&#xff0c;求满足总和 ≤ k \le k ≤k的子矩阵个数 如果T2&#xff0c;如果不固定左上角&#xff0c;求总和 ≤ k \le k…

20款Visual Studio实用插件推荐

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些实用的Visual Studio插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件&#xff0c;希望对大家有所帮助。 各位小伙伴有更好的…

Redis安全加固策略:绑定Redis监听的IP地址 修改默认端口 禁用或者重命名高危命令

Redis安全加固策略&#xff1a;绑定Redis监听的IP地址 & 修改默认端口 & 禁用或者重命名高危命令 1.1 绑定Redis监听的IP地址1.2 修改默认端口1.3 禁用或者重命名高危命令1.4 附&#xff1a;redis配置文件详解&#xff08;来源于网络&#xff09; &#x1f496;The Beg…

[HGAME 2024 WEEK3] Misc 与ai聊天

[HGAME 2024 WEEK3] Misc 与ai聊天 题目描述&#xff1a;跟他聊一聊吧&#xff0c;从他嘴里翘出flag 开题&#xff0c;这种一般是提示词注入漏洞。简而言之就是骗。 失败的案例 成功的案例
最新文章