设计模式-Factory

定义

工厂设计模式是一种创建型设计模式,它提供了一个用于创建对象的接口,但允许子类决定实例化哪个类。这种设计模式使一个类的实例化延迟到其子类。

实现举例

#include <iostream>
#include <string>// 抽象产品类
class Product {
public:virtual void use() = 0;
};// 具体产品类A
class ConcreteProductA : public Product {
public:void use() override {std::cout << "I'm using product A!" << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product {
public:void use() override {std::cout << "I'm using product B!" << std::endl;}
};// 工厂类
class Factory {
public:virtual Product* createProduct(std::string type) = 0;
};// 具体工厂类A
class ConcreteFactoryA : public Factory {
public:ConcreteProductA* createProduct(std::string type) override {if (type == "A") {return new ConcreteProductA();} else {return nullptr;}}
};// 具体工厂类B
class ConcreteFactoryB : public Factory {
public:ConcreteProductB* createProduct(std::string type) override {if (type == "B") {return new ConcreteProductB();} else {return nullptr;}}
};int main() {// 使用具体工厂类A创建产品AConcreteFactoryA* factoryA = new ConcreteFactoryA();ConcreteProductA* productA = dynamic_cast<ConcreteProductA*>(factoryA->createProduct("A"));if (productA != nullptr) {productA->use();delete productA; // 不要忘记删除产品对象!} else {std::cout << "Failed to create product A." << std::endl;}delete factoryA; // 不要忘记删除工厂对象!// 使用具体工厂类B创建产品BConcreteFactoryB* factoryB = new ConcreteFactoryB();ConcreteProductB* productB = dynamic_cast<ConcreteProductB*>(factoryB->createProduct("B"));if (productB != nullptr) {productB->use();delete productB; // 不要忘记删除产品对象!} else {std::cout << "Failed to create product B." << std::endl;}delete factoryB; // 不要忘记删除工厂对象!return 0;
}

总结

工厂设计模式具有以下特性:

  1. 封装性:产品的实例化被封装在工厂类中,这可以避免产品被修改,从而保证产品的一致性。
  2. 扩展性:增加新产品时,只需增加一个工厂子类,不会违反开闭原则。
  3. 解耦:使用者只需要知道自己需要什么产品,而不需要关心产品具体的特性,从而降低了模块间的耦合。

请注意,工厂设计模式也存在一些缺点,例如代码量可能会比较大,而且不利于扩展复杂的产品结构。

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

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

相关文章

电脑游戏录屏软件,记录游戏高光时刻

电脑游戏录制是游戏爱好者分享游戏乐趣、技巧和成就的绝佳方式&#xff0c;此时&#xff0c;一款好用的录屏软件就显得尤为重要。本文将为大家介绍三款电脑游戏录屏软件&#xff0c;通过对这三款软件的分步骤详细介绍&#xff0c;让大家更加了解它们的特点及使用方法。 电脑游戏…

记一次struct2漏洞获取服务器

文章目录 一、漏洞原因二、漏洞成果三、漏洞利用0x01 struts2漏洞获取shell0x02 todesk配置文件获取连接0x03 orcal数据库连接0x04 web网站 sso管理权限0x05 tomcat网站0x06 获取路由器权限0x07 远程桌面四、总结五、免责声明一、漏洞原因 由于网站使用struct2框架,未及时进行…

视频剪辑技巧:如何高效地将多个视频合并成一个新视频

在视频制作过程中&#xff0c;将多个视频合并成一个新视频是一个常见的操作。这涉及到将多个片段组合在一起&#xff0c;或者将不同的视频素材进行混剪。无论是制作一部完整的影片&#xff0c;还是为社交媒体提供短视频&#xff0c;都要掌握如何高效地将多个视频合并。现在一起…

ky10 server arm 在线编译安装openssl3.1.4

在线编译脚本 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzecho "安装OpenSSL${OPENSSLVER}...&q…

Nginx配置性能优化的方法

Nginx配置性能优化的方法 在大多数情况下&#xff0c;一个常规安装的Nginx对你的网站来说已经能很好地工作了。然而&#xff0c;如果你真的想挤压出Nginx的性能&#xff0c;你必须更深入一些。在本指南中&#xff0c;我将解释Nginx的那些设置可以微调&#xff0c;以优化处理大…

Joern安装与使用

环境准备 Joern需要在Linux环境中运行&#xff0c;所以在Windows系统中需要借助WSL或虚拟机安装。 JDK安装 Joern的运行需要JAVA环境的支持&#xff0c;本次采用的是JDK17&#xff0c;其他版本建议看一下Joern官方文档。 apt install openjdk-17-jre-headless 配置JAVA环境变…

Win11+Modelsim SE-64 10.6d搭建UVM环境

1、添加源文件及tb文件 在目录下建立文件夹&#xff0c;将DUT和Testbench添加进去&#xff0c;文件夹内容如下所示&#xff1a; 2、以《UVM实战》中的例子做简单的示例&#xff1a; 2.1 设计文件 &#xff1a;dut.sv 功能很简单&#xff0c;即将接受到的数据原封不动发送出去…

UE4基础篇十六:自定义 EQS 生成器

UE4 中的 EQS 带有一组很好的查询项生成器,但在某些情况下,您可能更喜欢根据需要创建生成器。我决定编写自己的生成器,因为我必须编写一个查询来找到查询器周围的最佳位置,但又不能太靠近它。我知道我可以添加一个距离测试来随着距离增加分数,但我什至不想考虑距查询器一定…

python之字符串

字符串常用操作 # 字符串常用方法 s a|b|c|b # 元素是否存在 if a in s:print(yes) # yes # 包含数量 n s.count(b) print(n) # 2 # 字符串切割&#xff0c;返回列表 l s.split(|) # [a, b, c, b] print(l) # 字符串替换 s s.replace(a,A) print(s) # A|b|c|b

vulnhub5

靶机下载地址&#xff1a; https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova 信息收集 第一步信息收集&#xff0c;还是老方法我习惯 fscan 和 nmap 一起用 Fscan 简单探测全局信息 ┌──(kali㉿kali)-[~/Desktop/Tools/fscan] └─$ ./fscan_amd64 -h 19…

5.4 Windows驱动开发:内核通过PEB取进程参数

PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息&#xff0c;进程环境块内部包含了进程运行的详细参数信息&#xff0c;每一个进程在运行后都会存在一个特有的PEB结构&#xff0c;通过附加进程并遍历这段结构即可得到非常多的有用信息。 在应用层下&am…

轿车5+1汽车变速器变速箱同步器操纵机构机械结构设计CAD汽车工程

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;汽车变速器 获取完整论文报告说明书工程源文件 变速器工程图 操纵机构3D图 一、机械式变速器的概述及其方案的确定 1.1 变速器的功用和要求 变速器的功用是根据汽车在不同的行驶条件下提出的要求&#xff0c;改变发动机…

JS将一个包含多种字符的数组分类

在JavaScript中&#xff0c;你可以使用数组的reduce()方法将一个包含多种字符的数组分类。reduce()方法会迭代数组的每个元素&#xff0c;并使用一个回调函数将数组缩减为单个值。在回调函数中&#xff0c;你可以根据需要将元素分类。 以下是一个示例代码&#xff0c;将一个包…

仪表盘:pyecharts绘制

一、仪表盘 在数据分析中&#xff0c;仪表盘图&#xff08;dashboard&#xff09;的作用是以一种简洁、图表化的方式呈现数据的关键指标和核心信息&#xff0c;以帮助用户快速理解数据的情况&#xff0c;并从中提取关键见解。 仪表盘图通常由多个图表、指标和指示器组成&…

[羊城杯2020]easyphp .htaccess的利用

[CTF].htaccess的使用技巧总结 例题讲解 掌握知识&#xff1a; 测试发现是阿帕奇服务器&#xff0c;就想到上传文件利用.htaccess配置文件执行jpg文件中的php代码&#xff0c;但是再进行第二次文件写入时会把之前的文件删除掉&#xff0c;所以不能上传两次来利用&#xff0c…

python之文件操作

文件的读取、修改、写入 知识点&#xff1a;不可以使用for循环生成变量&#xff0c;替代方式&#xff1a;将每次循环生成的数据添加到列表中&#xff0c;再对列表进行操作 例子&#xff1a;根据输入的环境名称操作hosts文件&#xff0c;注释掉其他环境 #env1 127.0.0.1 127.0.…

Altium Designer学习笔记6

原理图库的制作&#xff0c;SMA元件的制作&#xff1a; 图形不是很重要&#xff0c;重要的是管脚的功能。 Design Item ID和Designator两个值是要注意的。 进行Place放置&#xff0c;切换到原理图工作区&#xff0c;测试下功能。 AD9851元件库制作&#xff1a; 不需要再新建原…

【Ubuntu】Ubuntu arm64 部署 Blazor Server 应用

部署步骤 发布安装运行环境&#xff1a;dotnet-sdk&#xff08;必装&#xff09;、aspnetcore-runtime、dotnet-runtime安装证书设置环境变量&#xff1a;临时变量、当前用户永久变量、所有用户的永久变量运行&#xff1a;终端运行、后台运行 基本情况 开发系统环境 系统&am…

使用sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube&#xff0c;sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

OpenShift 4 - 部署 RHODS 环境,运行 AI/ML 应用(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 1.33 的环境中验证 文章目录 RHODS 简介安装 RHODS 环境运行环境说明用 RHODS Operator 安装环境创建 Jupyter Notebook 运行环境 开发调式 AI/ML 应用部署运行 AI/ML 应用视频参…