工厂模式-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…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...