C++ 设计模式:原型模式(Prototype Pattern)
链接:C++ 设计模式
链接:C++ 设计模式 - 工厂方法
链接:C++ 设计模式 - 抽象工厂
链接:C++ 设计模式 - 建造者模式
原型模式(Prototype Pattern)是一种创建型设计模式,它允许一个对象通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。原型模式通过克隆现有对象来避免复杂的初始化过程,从而提高对象创建的效率。
1.问题分析
在开发中,有时我们需要创建大量相似的对象,这些对象的创建过程可能非常复杂,涉及大量的初始化步骤和资源分配。每次通过构造函数创建新对象可能会导致性能问题和代码冗余。为了提高效率和简化代码,我们可以使用原型模式。
2.实现步骤
- 定义原型接口:定义一个包含克隆方法的接口,所有需要克隆的对象都应该实现这个接口。
- 实现具体原型类:实现具体的原型类,这些类需要实现克隆方法,以便能够复制自身。
- 使用原型创建对象:通过调用原型对象的克隆方法来创建新对象,而不是通过构造函数创建新对象。
3.代码示例
3.1.定义原型接口
// 机器人接口
class Robot {public:virtual ~Robot() = default;virtual std::unique_ptr<Robot> clone() const = 0;virtual void performTask() const = 0;
};
3.2.实现具体原型类
// 具体机器人A
class CleaningRobot : public Robot {public:std::unique_ptr<Robot> clone() const override { return std::make_unique<CleaningRobot>(*this); }void performTask() const override { std::cout << "CleaningRobot is cleaning the floor." << std::endl; }
};
// 具体机器人B
class CookingRobot : public Robot {public:std::unique_ptr<Robot> clone() const override { return std::make_unique<CookingRobot>(*this); }void performTask() const override { std::cout << "CookingRobot is cooking a meal." << std::endl; }
};
3.3.使用原型创建对象
// 客户端类
class RobotManager {public:RobotManager(const Robot* prototype) : prototype_(prototype) {}void manageRobot() const {if (prototype_) {std::unique_ptr<Robot> robot = prototype_->clone();robot->performTask();} else {std::cerr << "Error: No prototype provided." << std::endl;}}private:const Robot* prototype_;
};
3.4. 客户端代码
int main() {// 创建具体的机器人对象std::unique_ptr<Robot> cleaningPrototype = std::make_unique<CleaningRobot>();std::unique_ptr<Robot> cookingPrototype = std::make_unique<CookingRobot>();// 创建RobotManager并传递原型对象的指针RobotManager cleaningManager(cleaningPrototype.get());cleaningManager.manageRobot();RobotManager cookingManager(cookingPrototype.get());cookingManager.manageRobot();return 0;
}
4.总结
原型模式与工厂方法模式的对比:
-
原型模式
- 对象创建方式:通过克隆现有的原型对象来创建新对象。
- 适用场景:
- 对象的构造初始化过程复杂。
- 需要大量相似对象。
- 性能要求高,通过克隆现有对象比通过构造函数创建对象更高效。
- 优点:
- 避免了复杂的初始化过程。
- 可以在运行时动态改变被复制的对象。
- 提供了简化的对象创建方式。
- 缺点:
- 需要实现克隆方法,可能涉及深拷贝和浅拷贝的问题。
- 对象的克隆过程可能比较复杂。
-
工厂方法模式
- 对象创建方式:通过工厂方法创建新对象,通常是通过构造函数进行初始化。
- 适用场景:
- 需要创建不同类型的对象。
- 对象创建过程相对简单。
- 优点:
- 提供了创建对象的接口,子类可以决定实例化哪一个类。
- 遵循开闭原则,可以通过添加新的子类来扩展产品。
- 缺点:
- 每次调用工厂方法时,都会创建一个新的对象,可能涉及复杂的初始化过程。
- 需要为每种产品创建相应的工厂类,增加了代码的复杂性。
相关文章:
C++ 设计模式:原型模式(Prototype Pattern)
链接:C 设计模式 链接:C 设计模式 - 工厂方法 链接:C 设计模式 - 抽象工厂 链接:C 设计模式 - 建造者模式 原型模式(Prototype Pattern)是一种创建型设计模式,它允许一个对象通过复制现有对象来…...
计算机网络 (12)物理层下面的传输媒体
前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路,也称为传输介质或传输媒介,并不包含在计算机网络体系结构中,而是处于物理层之下。 一、传输媒体的分类 导向型媒体:电磁波被导引沿着固体媒体传播。常见的导向…...
SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现
本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作,帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询,还是复杂的多表联动,甚至是大数据量的批量操作…...
测试带宽上行方法
测试宽带上行速度的软件有多种,以下是一些常见的选择: Speedtest 平台支持:iOS、Android、Windows、MacOS等 特点:全球知名的网络测速软件,测试结果准确,支持多平台。用户可以选择最近的服务器进行测试&am…...
天天跳绳(???)
广东省人民政府门户网站 https://www.gd.gov.cn/zwgk/zdlyxxgkzl/whjg/content/post... 二沙岛变身智能“运动岛” - 广东省人民政府门户网站 2020年10月20日 广州二沙岛,犹如一颗璀璨明珠点缀在珠江之心,自然风光旖旎,功能分区清 … 公共…...
module ‘django.db.models‘ has no attribute ‘FieldDoesNotExist‘
module ‘django.db.models’ has no attribute ‘FieldDoesNotExist’ xadmin报错 原因 django与xadmin版本不匹配。 django==3.2.7 xadmin-django==3.0.2解决方案 在xadmin/view/edit.py的388行改为 from django.core import exceptions if self.request_method ==...
智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之10 方案再探之1:特定于领域的模板 之1 随想交流
前面的项目再次不能继续。不得已再一次重新建了这个项目,并以当前修改版本的项目文件为附件开始了今天的沟通。所以 标明是“方案再探” 在新建这个项目的同时,就将项目文件作为附件添加进去,然后开始。 文件链接:智能工厂的设计…...
Excel将混乱的多行做成1列
前提:需要excel有textjoin函数,这个函数,根据百度说是在2016之后的版本才说,功能比较强大。 目标是将数据按从左到右,再从上到下排成一列。 公式法 首先用textjoin函数将文本包起来,做成一个超长文本。 然…...
Django项目部署到服务器
文章目录 django项目部署到服务器在服务器上安装Django和依赖:项目代码上传配置数据库收集静态文件配置Web服务器配置Gunicorn(WSGI服务器)启动/停止/重载systemd服务。 django项目部署到服务器 在服务器上安装Django和依赖: su…...
SpringBoot集成Flowable
一、工作流介绍 1、概念 通过计算机对业务流程的自动化管理。工作流是建立在业务流程的基础上,一个软件的系统核心根本上还是系统的业务流程,工作流只是协助进行业务流程管理。 解决的是:在多个参与者之间按照某种预定义的规则自动进行传递…...
大模型从零开始——预训练之分词 Tokenization
文章目录 一、概念介绍 二、单词级别分词 三、字符级别分词 四、子词级别分词 BPE/BBPE分词 BPE:Byte-Pair Encoding (BPE) BBPE:Byte-level BPE (BBPE) WordPiece分词 Unigram分词 五、总结 词元化(Tokenization)是数据预处…...
Python下载包缓慢时怎么修改镜像源
前言 在使用Python下载第三方包时,有时会比较缓慢,与Linux环境中下载软件一样可以替换软件源一样,Python下载源也可以进行修改,因为总是记不住镜像地址,特此记录一下。 常用镜像 豆瓣镜像: https://pypi.…...
每日一练 | 时延和抖动
01 真题题目 关于时延和抖动,下面描述正确的是(多选): A. 端到端时延等于处理时延与队列时延之和 B. 抖动是因为每个包的端到端时延不相等造成的 C. 抖动的大小跟时延的大小相关,时延小则抖动的范围也小,时…...
嵌入式开发之使用 FileZilla 在 Windows 和 Ubuntu 之间传文件
01-FileZilla简介 FileZilla 是一个常用的文件传输工具,它支持多种文件传输协议,包括以下主要协议: FTP (File Transfer Protocol) 这是 FileZilla 最基本支持的协议。FTP 是一种明文传输协议,不加密数据(包括用户名和…...
腾势D9风光不再?中期改款能否及时“救火”
文/王俣祺 导语:腾势D9销量下滑了,这背后是MPV市场的整体没落还是众多新车的围追堵截?如今2025款腾势D9也来了,“加量不加价”的新车又能否逆转乾坤,重夺MPV市场霸主的地位? 腾势D9销量下滑的“真相” 回…...
OpenCV-Python实战(11)——边缘检测
一、Sobel 算子 通过 X 梯度核与 Y 梯度核求得图像在,水平与垂直方向的梯度。 img cv2.Sobel(src*,ddepth*,dx*,dy*,ksize*,scale*,delta*,borderType*)img:目标图像。 src:原始图像。 ddepth:目标图像深度,-1 代表…...
【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案
随著车载技术的快速进步,驾驶安全越来越受到重视,而疲劳驾驶是造成交通事故的重要原因之一。传统的驾驶监控技术因精度不足或反应迟缓,无法满足实时监测需求。因此,结合人工智能技术的疲劳驾驶检测系统成为行业新方向,…...
机器学习随机森林回归时间序列预模型中时间滑动窗口作用以及参数设置
一、时间序列模型中时间滑动窗口作用 在时间序列模型中,时间滑动窗口(Sliding Window)起到了至关重要的作用。它是一种常见且有效的数据表示技术,通过将时间序列数据分割成多个固定大小的窗口,来捕捉和分析数据中的模式…...
【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.5.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例: m…...
自定义luacheck校验规则
安装运行环境 安装环境及源码解析,参考:LuaCheck校验原理解析 自定义校验规则 从代码中可以看出,定义一条规则有以下关键点: 需要定义告警信息:由键值对组成,key为告警编码(不一定为纯数字&…...
MPh 开源项目教程
MPh 开源项目教程 【免费下载链接】MPh Pythonic scripting interface for Comsol Multiphysics 项目地址: https://gitcode.com/gh_mirrors/mp/MPh 项目介绍 MPh 是一个基于 Python 的强大开源项目,旨在简化数学物理问题的求解过程。它结合了符号计算的灵活…...
告别卡顿!用ZLMRTCClient.js和Vue3打造超低延迟WebRTC监控播放器(附完整代码)
超低延迟WebRTC监控播放器:基于ZLMRTCClient.js与Vue3的工程实践 在安防监控、智慧园区等对实时性要求极高的场景中,传统流媒体方案如HLS或FLV往往面临3-5秒甚至更高的延迟。这种延迟在关键场景下可能导致严重后果——当监控画面显示"一切正常"…...
wlnmp一键安装包260520更新:多软件版本升级,支持多系统架构快速部署
wlnmp一键安装包更新:多软件版本升级wlnmp一键安装包在260520迎来更新,此次更新涉及多个重要软件的版本升级,包括nginx1.30.1、php8.2.31、php8.3.31等多个php版本,以及MySQL8.0.46、MySQL8.4.9。这些软件版本的更新,为…...
深度解析LevelUI:现代LevelDB可视化管理的完整实战指南
深度解析LevelUI:现代LevelDB可视化管理的完整实战指南 【免费下载链接】levelui A GUI for LevelDB management based on atom-shell. 项目地址: https://gitcode.com/gh_mirrors/le/levelui 在NoSQL数据库生态中,LevelDB以其出色的性能和简洁的…...
OpenClaw 架构详解:AI Agent 的编排与执行骨架
核心定位:OpenClaw 自动化运行时(Automation Runtime),一个给 AI 套上安全、可控、可审计缰绳的框架。 它不追求 AI 的"惊喜",而是追求可预测性、可审计性和零故障。 文章目录一、设计哲学:网关…...
别让“AI味”代码毁了你的项目:一份AI生成代码的质量评估与防御指南
别让“AI味”代码毁了你的项目:一份AI生成代码的质量评估与防御指南 前段时间,团队里一个新人在周会上展示了他用 AI 辅助完成的一个支付模块。代码跑通了,测试用例全绿,乍一看没什么问题。但我顺手点开一个 Service 层方法&#…...
【Perplexity知识图谱查询实战指南】:20年专家亲授3大隐性陷阱与5步精准检索法
更多请点击: https://codechina.net 第一章:Perplexity知识图谱查询的核心原理与能力边界 Perplexity 知识图谱查询并非传统关键词匹配,而是基于语义解析的多跳推理引擎。其核心依赖于三元组嵌入(Triple Embedding)与…...
蓝桥杯JavaB组赛后复盘:从‘类斐波那契’到‘星际旅行’,我的解题思路与踩坑实录
蓝桥杯JavaB组赛后复盘:从‘类斐波那契’到‘星际旅行’,我的解题思路与踩坑实录 1. 考场策略与时间分配 比赛开始前15分钟,我快速浏览了所有题目,用铅笔在草稿纸上标注了每道题的预估难度和解题方向。这种策略让我避免了"死…...
从CID到SCR:一张SD卡的‘身份证’里到底藏了多少秘密?聊聊厂商、版本与总线宽度的那些事
从CID到SCR:一张SD卡的‘身份证’里到底藏了多少秘密?聊聊厂商、版本与总线宽度的那些事 当你从抽屉里翻出一张积灰的SD卡,除了容量标签和品牌Logo,是否想过这张小塑料片里还藏着完整的"身份档案"?就像法医通…...
从芯片手册到PCB:SPL06与MPU9250的I2C实战布线要点与防护设计
从芯片手册到PCB:SPL06与MPU9250的I2C实战布线要点与防护设计 在无人机飞控板的设计中,气压传感器SPL06和九轴传感器MPU9250的稳定工作直接关系到飞行姿态控制的精确性。本文将深入探讨这两个关键传感器在PCB布局中的I2C总线设计要点,以及如何…...
