工厂模式-C++实现
工厂模式是一个创建型设计模式,即“对象创建模式”,通过这种模式可以绕开new,来避免对象创建过程中,也就是new的方法造成的紧耦合,从而支持对象创建的稳定。
工厂模式中引入了一个工厂类,该工厂负责根据客户端的请求创建相应的对象案例,客户端只需要通过工厂类获取对象,不需要之间调用具体对象的构造函数。
工厂模式有四个角色:抽象产品、具体产品、抽象工厂、具体工厂。
举例:
假设我们现在要创建一个图形库,支持绘制矩形和圆形两种形状。
// 抽象产品
class IShape
{
public:virtual ~IShape() {}virtual void Draw() = 0;
};// 具体产品-矩形
class Rectange: public IShape
{
public:virtual void Draw() override{std::cout << "绘制矩形" << std::endl;}
};// 具体产品-圆形
class Circle: public IShape
{
public:virtual void Draw() override{std::cout << "绘制圆形" << std::endl;}
};// 抽象工厂
class IFactory
{
public:virtual ~IFactory() {}virtual std::shared_ptr<IShape> CreateShape() = 0;
};// 具体工厂 - 创建圆形
class CircleFactory: public IFactory
{
public:virtual std::shared_ptr<IShape> CreateShape() override{return std::make_shared<Circle>();}
};// 具体工厂 - 创建矩形
class RactangeFactory: public IFactory
{
public:virtual std::shared_ptr<IShape> CreateShape() override{return std::make_shared<Rectange>();}
};
void TestFactory()
{// 创建矩形工厂std::shared_ptr<IFactory> rac_factory = std::make_shared<RactangeFactory>();// 创建圆形工厂std::shared_ptr<IFactory> cir_factory = std::make_shared<CircleFactory>();// 创建矩形产品std::shared_ptr<IShape> ractange = rac_factory->CreateShape();// 创建圆形产品std::shared_ptr<IShape> circle = cir_factory->CreateShape();// 绘制矩形ractange->Draw();// 绘制圆形circle->Draw();
}int main()
{// 策略模式用法// TestStrategy();// TestObserver();// TestDecorator();// TestBridge();TestFactory();system("pause");return 0;
}
抽象图形类 IShape 定义了图形的抽象接口,具体的图形类 Circle 和 Rectangle 继承自 Shape,实现了抽象接口,并实现了各自的绘制逻辑。
抽象工厂类 IFactory 定义了创建图形对象的抽象接口,具体的工厂类 CircleFactory 和 RectangleFactory 继承自 IFactory,实现了创建图形对象的具体逻辑。
在客户端代码中,分别通过 CircleFactory 和 RectangleFactory 工厂类来创建圆形和矩形对象,并调用各自的 Draw() 方法,共同完成图形的绘制过程。
工厂模式的主要优点包括:
- 将对象的创建与使用分离,使客户端代码只依赖于抽象工厂和抽象产品,而不依赖于具体产品。
- 可以很方便地扩展和修改具体产品的创建过程,而对客户端代码没有影响。
- 符合开闭原则,即对修改关闭,对扩展开放。
- 遵循依赖倒置原则,即
1、高模块不应该依赖低模块,两者都应该依赖抽象。
2、抽象不应该依赖具体实现,具体实现应该依赖抽象。
简单来说,依赖倒置原则的核心思想是通过创建抽象接口或者抽象类来作为模块之间的依赖(比如上面代码中的抽象产品和抽象工厂),而不是依赖具体的实现类。
通过遵循依赖倒置原则,我们能够实现以下几个好处:
- 提高代码的灵活性和可扩展性:通过依赖于抽象而不是具体实现,我们可以方便地替换底层模块,以及添加新的实现来满足不同的需求,而不需要修改高层模块的代码。
- 减少模块间的耦合度:模块间的依赖关系通过抽象接口进行解耦,使得模块的改动不会对其他模块产生过多的影响。
- 更好的代码维护性:由于模块间的依赖关系被明确地定义在抽象层面上,我们可以更容易理解和维护代码。
相关文章:
工厂模式-C++实现
工厂模式是一个创建型设计模式,即“对象创建模式”,通过这种模式可以绕开new,来避免对象创建过程中,也就是new的方法造成的紧耦合,从而支持对象创建的稳定。 工厂模式中引入了一个工厂类,该工厂负责根据客…...
安装应用与免安装应用差异对比
差异 安装的程序和免安装的应用程序之间有以下几个方面的差别: 安装过程:安装的程序需要通过一个安装程序或安装脚本进行安装。这个过程通常会将应用程序的文件和依赖项复制到指定的目录,并进行一些配置和注册操作。免安装的应用程序则不需要…...
FiscoBcos使用Go调用合约
环境: fisco2.8.0 go 1.17 go-sdk 1.0.0 solidity 0.4.25 前言 请提前启动好四个fisco节点。 请准备好一个属于此fisco节点的账户私钥【待会调用合约和部署合约会用到】 此文章将讲解 官方文档使用gosdk部署helloworld合约并调用其方法 合约开发样例 官网提示 G…...
自然语言处理(NLP)-spacy简介以及安装指南(语言库zh_core_web_sm)
spacy 简介 spacy 是 Python 自然语言处理软件包,可以对自然语言文本做词性分析、命名实体识别、依赖关系刻画,以及词嵌入向量的计算和可视化等。 1.安装 spacy 使用 “pip install spacy" 报错, 或者安装完 spacy,无法正…...
CTF-PWN-tips
文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …...
《Effective C++》条款21
必须返回对象时,别妄想返回其reference 如果你的运算符重载函数写成了返回reference的形式: class A { public:A(int a,int b):x(a),y(b){}friend const A& operator*(const A& a, const A& b); private:int x;int y; }; const A& opera…...
决策树,sql考题,30个经典sql题目
大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…...
【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
关于Java中的深拷贝与浅拷贝
Java中的深拷贝和浅拷贝是针对对象和数组等引用数据类型的复制操作。 浅拷贝(Shallow Copy): 对于基本数据类型,浅拷贝直接复制其值。对于引用数据类型,浅拷贝只复制对原对象的引用,而不是复制对象本身。因…...
13.真刀实枪做项目---博客系统(页面设计)
文章目录 1.预期效果1.1博客列表页效果1.2博客详情页效果1.3博客登陆页效果1.4博客编辑页效果 2.实现博客列表页2.1实现导航栏2.2实现版心2.3实现个人信息2.4实现博客列表2.5博客列表页完整代码 3.实现博客正文页3.1引入导航栏3.2引入版心3.3引入个人信息3.4实现博客正文3.5博客…...
VScode 配置用户片段
文件->首选项->配置用户片段->新建全局用户片段 后续就可以通过vv3来直接生成下面的代码 {// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // description. Add comma separated ids of the l…...
Fedora 项目近日发布了 Fedora Linux 39
导读几经推迟之后,Fedora 项目近日发布了 Fedora Linux 39,这是红帽公司赞助的面向大众的 GNU/Linux 发行版的最新稳定版本,采用了最新的技术和开源应用程序。 Fedora Linux 39 由 Linux 内核 6.5 支持,并提供了一些最新的桌面环境…...
Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
目录 前言: 一、什么是iBeacon技术 二、Uniapp连接iBeacon设备的准备工作 硬件设备: 三、Uniapp连接iBeacon设备的实现步骤 创建Uniapp项目: 四、Uniapp连接iBeacon设备的应用场景 室内导航: 五、Uniapp连接iBeacon设备的未来…...
GCD:异步同步?串行并发?一文轻松拿捏!
GCD 文章目录 GCD进程线程进程与线程的关系进程与线程的区别 任务(执行的代码)队列线程与队列的关系 队列任务**同步执行任务(sync)**辅助方法**异步执行任务(async)**总结栅栏任务迭代任务 队列详细属性QoSAttributes…...
学习c#的第十七天
目录 C# 异常处理 异常的原因 System.Exception 类 如何处理异常 常见的异常类 throw 语句 throw 表达式 try 语句 try-catch 语句 try-finally 语句 try-catch-finally 语句 when 异常筛选器 异步和迭代器方法中的异常 C# 异常处理 C # 中的异常提供了结构化、统…...
龙芯 操作系统选择和安装
龙芯3a5000及之后的cpu底层架构已经从mips64el改为了loongarch64 所以这里分了2种来说明,分别对应3a4000之前的和3a5000之后的 龙芯的系统安装难点在于操作系统的选取和引导 一、烧录工具 制作安装盘使用常规的烧录工具是不行滴,会提示没有\boot\initrd…...
【开源】基于JAVA的智能停车场管理系统
项目编号: S 005 ,文末获取源码。 \color{red}{项目编号:S005,文末获取源码。} 项目编号:S005,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…...
使用IDEA 将Eclipse java工程转为maven格式
使用IDEA 将Eclipse java工程转为maven格式 ①使用idea打开项目,在项目根目录下右键选择 Add Framework Support 选择 maven ,引入maven ②找到项目中的.classpath文件或者lib目录 根据.classpath文件或者lib目录中列举的jar包名,将其依次手…...
CCF CSP认证 历年题目自练Day47
题目 试题编号: 201712-3 试题名称: Crontab 时间限制: 10.0s 内存限制: 256.0MB 样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * have_dinner 样例输出 201711170…...
LeetCode Hot100之十:239.滑动窗口最大值
题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示: 1 < nums.length < 10^5 -10^4 < nums[i…...
FlexRay帧格式拆解:从Header到Trailer,手把手教你读懂汽车总线的‘数据包’
FlexRay帧格式实战解析:像拆解网络包一样掌握汽车总线通信 在汽车电子系统开发中,理解总线协议就像网络工程师需要精通TCP/IP一样重要。FlexRay作为高性能车载网络的核心协议,其帧格式设计既体现了汽车电子对确定性的严苛要求,又融…...
别再只用柱状图了!用Python的Matplotlib画个酷炫的雷达图,5分钟搞定你的个人技能展示
用Python打造专业级技能雷达图:5步提升你的职场竞争力 简历上那些千篇一律的柱状图和百分比条已经让招聘官审美疲劳了?试试用Matplotlib绘制一个令人眼前一亮的雷达图来展示你的核心技能组合。这种可视化方式不仅能清晰呈现你在各个领域的熟练程度&#…...
GPEN肖像增强使用技巧:自然、强力、细节三种模式适用场景解析
GPEN肖像增强使用技巧:自然、强力、细节三种模式适用场景解析 1. 认识GPEN的三种处理模式 GPEN作为当前最先进的肖像增强工具之一,其核心价值在于提供了三种差异化的处理模式:自然、强力和细节。这三种模式不是简单的强度差异,而…...
Lingbot-Depth-Pretrain-ViTL-14 Anaconda环境搭建:创建隔离的Python开发与推理环境
Lingbot-Depth-Pretrain-ViTL-14 Anaconda环境搭建:创建隔离的Python开发与推理环境 你是不是也遇到过这种情况:好不容易跟着教程跑通了一个AI项目,结果过两天想跑另一个项目时,发现各种库版本冲突,报错满天飞&#x…...
SOONet模型Python入门实践:用10行代码实现视频片段搜索
SOONet模型Python入门实践:用10行代码实现视频片段搜索 你是不是也遇到过这种情况:手里有一段很长的视频,想快速找到某个特定场景,比如“主角第一次出场的时候”或者“那个爆炸的镜头”,结果只能手动拖进度条…...
RS232 vs RS485 vs TTL:如何为你的嵌入式项目选择正确的电平标准?
RS232 vs RS485 vs TTL:嵌入式工程师的电平标准选型指南 在嵌入式系统开发中,选择合适的电平标准往往决定了整个通信系统的可靠性和成本效益。就像建筑师需要根据不同的地质条件选择合适的地基方案一样,工程师也需要根据传输距离、环境干扰和…...
Cohere Transcribe:20亿参数14语言开源语音识别模型发布
Cohere Transcribe:20亿参数14语言开源语音识别模型发布 【免费下载链接】cohere-transcribe-03-2026 项目地址: https://ai.gitcode.com/hf_mirrors/CohereLabs/cohere-transcribe-03-2026 导语:Cohere正式发布开源语音识别模型Cohere Transcri…...
C++的std--ranges中的技术优化排序
C20引入的std::ranges库为算法操作带来了革命性改进,尤其在排序优化领域展现出强大的现代性。本文将深入探讨std::ranges如何通过结构化绑定、惰性求值和定制化投影等技术,实现更高效、更灵活的排序操作,为开发者提供超越传统STL的解决方案。…...
深求·墨鉴快速部署指南:3步搞定,体验优雅的文档图片转文字
深求墨鉴快速部署指南:3步搞定,体验优雅的文档图片转文字 1. 引言:当OCR遇见东方美学 在日常办公和学习中,我们经常需要将纸质文档、书籍图片或手写笔记转换为可编辑的电子文本。传统OCR工具往往只注重功能实现,而忽…...
09. CSS生成艺术创作指南:用代码绘制视觉诗篇
09. CSS生成艺术创作指南:用代码绘制视觉诗篇 引言 CSS 不仅仅是样式语言,它也是一种创作艺术的工具。通过 CSS,我们可以创建出令人惊叹的生成艺术作品,这些作品不仅美观,而且具有动态性和交互性。作为一名把代码当散文…...
