【C++ 设计模式】简单工厂模式

文章目录

  • 前言
  • 一、简单工厂模式是什么?
  • 二、实现原理
  • 三、UML类图
  • 四、简单工厂模式具体代码
  • 总结


前言

在软件开发中,设计模式是解决特定问题的可复用解决方案。其中,简单工厂模式是一种创建型设计模式,旨在封装对象的创建过程,并将对象的创建与使用分离。这种模式提供了一个统一的接口,用于根据给定的参数或条件创建对象,使得客户端代码无需关心具体对象的创建细节。本文将介绍简单工厂模式的概念、结构以及如何在 C++ 中实现。


一、简单工厂模式是什么?

简单工厂模式是一种设计模式,它提供了一个专门的工厂类来创建对象,而不需要在客户端代码中直接实例化具体的对象。这样做可以封装对象的创建逻辑,使得客户端代码更加简洁,同时也提高了代码的灵活性和可维护性。

二、实现原理

工厂类(Factory): 工厂类负责创建对象,它通常包含一个静态方法或非静态方法来根据客户端的需求创建具体的对象。工厂类根据传入的参数或条件,决定创建哪种类型的对象并返回给客户端。

抽象产品类(Product): 抽象产品类定义了具体产品类的公共接口,它可以是一个抽象类或者接口。工厂类根据这个抽象产品类来创建具体的产品对象。

具体产品类(ConcreteProduct): 具体产品类是实现了抽象产品类接口的具体对象,它们是工厂类创建的目标对象。

实现简单工厂模式的关键在于工厂类如何根据客户端的需求来创建具体的产品对象,这通常通过条件判断或者 switch 语句来实现。客户端代码只需要调用工厂类的创建方法,并传入相应的参数,即可获得所需的对象实例,而不需要关心具体的对象创建过程。

核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的 virtual 函数得到不同的结果。

三、UML类图

在这里插入图片描述
ProductA和ProductB都继承于Product,他们是关联关系
Factory用于生产Product,他们是联合关系

四、简单工厂模式具体代码

#include <iostream>
#include <memory>// 抽象产品类
class Product {
public:virtual void operation() const{};
};// 具体产品类 A
class ConcreteProductA : public Product {
public:void operation() const override {std::cout << "ConcreteProductA operation\n";}
};// 具体产品类 B
class ConcreteProductB : public Product {
public:void operation() const override {std::cout << "ConcreteProductB operation\n";}
};// 工厂类
class Factory {
public:// 工厂方法,根据传入的类型创建对应的产品对象Product* createProduct(char type) const {switch (type) {case 'A':return new ConcreteProductA;case 'B':return new ConcreteProductB;default:throw std::invalid_argument("Invalid product type");}}
};int main() {Factory factory;// 创建产品 AConcreteProductA *productA = reinterpret_cast<ConcreteProductA*>(factory.createProduct('A'));productA->operation();// 创建产品 BConcreteProductB* productB = reinterpret_cast<ConcreteProductB*>(factory.createProduct('B'));productB->operation();return 0;
}

在这里插入图片描述
这段代码是一个简单工厂模式的实现示例,主要包括了抽象产品类 Product、具体产品类 ConcreteProductA 和 ConcreteProductB,以及工厂类 Factory。

在工厂类 Factory 中,有一个工厂方法 createProduct,它根据传入的参数 type 创建对应的产品对象。如果传入的参数是 ‘A’,则创建并返回一个 ConcreteProductA 对象;如果是 ‘B’,则创建并返回一个 ConcreteProductB 对象。如果传入的参数不是 ‘A’ 或 ‘B’,则抛出 std::invalid_argument 异常。

在 main 函数中,通过工厂类创建了产品 A 和产品 B 的对象,然后调用它们的 operation 方法,分别输出了 “ConcreteProductA operation” 和 “ConcreteProductB operation”。

值得注意的是,在 main 函数中使用了 reinterpret_cast 来将 Product* 类型转换为具体的产品类型指针,这是一种强制类型转换方式。虽然这段代码在技术上可以工作,但这种类型转换通常是不推荐的,因为它绕过了编译器的类型检查,可能导致运行时错误。更好的做法是使用虚函数和动态多态性来处理不同类型的产品对象。


总结

简单工厂模式是一种简单但有效的设计模式,用于封装对象的创建过程。通过将对象的创建逻辑放在一个工厂类中,客户端代码可以通过统一的接口来请求对象,而无需关心具体对象的创建细节。这种模式提高了代码的可维护性和可扩展性,使得系统更加灵活。在 C++ 中,可以通过工厂类的静态方法或非静态方法来实现简单工厂模式,根据实际需求选择合适的方式来创建对象。通过应用简单工厂模式,可以使代码更加清晰、易于理解,并且更容易进行单元测试和维护。

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

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

相关文章

使用耳机壳UV树脂制作私模定制耳塞的价格如何呢?

耳机壳UV树脂制作私模定制耳塞的价格因多个因素而异&#xff0c;如材料、工艺、设计、定制复杂度等。 根据我目前所了解到的信息&#xff0c;使用UV树脂制作私模定制耳塞的价格可能在数百元至数千元不等。具体价格还需根据用户的需求和预算进行综合考虑。 如需获取更准确的报…

MySQL order by 语句执行流程

全字段排序 假设这个表的部分定义是这样的&#xff1a; CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 有如下 SQL 语…

抖音在线点赞任务发布接单运营平台PHP网站源码

源码简介 抖音在线点赞任务发布接单运营平台PHP网站源码 多个支付通道分级会员制度 介绍&#xff1a; 1、三级代理裂变&#xff0c;静态返佣/动态返佣均可设置。&#xff08;烧伤制度&#xff09;。 2、邀请二维码接入防红跳转。 3、自动机器人做任务&#xff0c;任务时间…

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹前言第1章 添加文件夹第2章 添加文件路径2.1 相对路径方法2.2 绝对路径方法 总结 前言 在编程的过程中&#xff0c;如果需要在原有的工程基础上新增其它的…

微信小程序-day01

文章目录 前言微信小程序介绍 一、为什么要学习微信小程序?二、微信小程序的历史创建开发环境1.注册账号2.获取APPID 三、下载微信开发者工具1.创建微信小程序项目2.填写相关信息3.项目创建成功 四、小程序目录结构项目的主体组成结构 总结 前言 微信小程序介绍 微信小程序&…

【OceanBase诊断调优 】 —— 合并问题如何排查?

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 OceanBase 数据库的存储引擎基于 LSM-Tree 架构&#xff0c;将数据分为静态基线数据&#xff08;放在 SSTable 中&#xff…

留学生课设|R语言|研究方法课设

目录 INSTRUCTIONS Question 1. Understanding Quantitative Research Question 2. Inputting data into Jamovi and creating variables (using the dataset) Question 3. Outliers Question 4. Tests for mean difference Question 5. Correlation Analysis INSTRUCTIO…

有趣的前端知识(三)

推荐阅读 有趣的前端知识&#xff08;一&#xff09; 有趣的前端知识&#xff08;二&#xff09; 文章目录 推荐阅读JS内置对象JS外部对象BOM模型history对象screen对象navigator对象 DOM&#xff08;文档对象模型&#xff09;DOM的方法&#xff08;对于节点的操作&#xff09…

金蝶BI方案能解决云星空数据分析痛点吗?

金蝶云星空作为一个主攻企业管理流程的软件确实立下了汗马功劳&#xff0c;但一到数据分析方面那就阻碍重重了。直接的感受是分析步骤多且复杂&#xff0c;数据展现不够直观易懂&#xff0c;有些分析指标的计算真的很难实现&#xff0c;跨部门跨组织计算指标、合并账套什么的能…

vscode 向下复制当前行(即visual studio 中的Ctrl + D)功能快捷键

参考:https://blog.csdn.net/haihui1996/article/details/87937912 打开vscode左下角键盘快捷键设置&#xff0c;找到copy line down&#xff0c;即可查看当前默认快捷键为“shift Alt ↓” 双击快捷键&#xff0c;输入自己想要的快捷组合&#xff0c;如CtrlD&#xff0c;然…

尚硅谷SpringBoot3笔记 (二) Web开发

Servlet&#xff0c;SpringMVC视频推荐&#xff1a;53_尚硅谷_servlet3.0-简介&测试_哔哩哔哩_bilibili HttpServlet 是Java Servlet API 的一个抽象类&#xff0c;用于处理来自客户端的HTTP请求并生成HTTP响应。开发人员可以通过继承HttpServlet类并重写其中的doGet()、do…

给电脑加硬件的办法 先找电脑支持的接口,再买相同接口的

需求&#xff1a;我硬盘太小&#xff0c;换或加一个大硬盘 结论&#xff1a;接口是NVMe PCIe 3.0 x4 1.找到硬盘型号 主硬盘 三星 MZALQ512HALU-000L2 (512 GB / 固态硬盘) 2.上官网查 或用bing查 非官方渠道信息&#xff0c;不确定。

[论文笔记]LLaMA: Open and Efficient Foundation Language Models

引言 今天带来经典论文 LLaMA: Open and Efficient Foundation Language Models 的笔记&#xff0c;论文标题翻译过来就是 LLaMA:开放和高效的基础语言模型。 LLaMA提供了不可多得的大模型开发思路&#xff0c;为很多国产化大模型打开了一片新的天地&#xff0c;论文和代码值…

uniapp运行钉钉小程序

因项目原因&#xff0c;公司需要在钉钉里面开发小程序。之前用uniapp开发过app&#xff0c;H5&#xff0c;小程序。还真没尝试过钉钉小程序&#xff0c;今天就简单的记录下uniapp运行钉钉小程序中的过程。 在项目目录新建package.json文件&#xff0c;在文件中添加如下代码&am…

医学图像目标跟踪论文阅读笔记 2024.03.08~2024.03.14

“Inter-fractional portability of deep learning models for lung target tracking on cine imaging acquired in MRI-guided radiotherapy” 2024年 期刊 Physical and Engineering Sciences in Medicine 医学4区 没资源&#xff0c;只读了摘要&#xff0c;用的是U-net、a…

解决iview表格固定列横向滚动条无法拖动问题

问题描述&#xff1a; iview的table添加固定列以后&#xff0c;滚动条在固定列下面无法拖动&#xff0c;只能在滚动区域有所反应 解决办法 【写入main.js引入的全局文件时不需要::v-deep; 写入单个文件需要加::v-deep】 方法一&#xff1a;【带合计行也适用】 //解决iview表…

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹&#xff0c;Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

idea如何使用,从激活开始

idea到期后激活使用 如何使用 点击阅读 idea分享

HTML5、CSS3面试题(二)

上一章:HTML5、CSS3面试题&#xff08;一&#xff09; 哪些是块级元素那些是行内元素&#xff0c;各有什么特点 &#xff1f;&#xff08;必会&#xff09; 行内元素: a、span、b、img、strong、input、select、lable、em、button、textarea 、selecting 块级元素&#xff1…