设计模式-13 - Prototype Design Pattern 原型设计模式
设计模式-13 - Prototype Design Pattern 原型设计模式
1.定义
原型设计模式是一种创建对象的方式,它通过复制一个现有的对象(原型)来创建一个新对象。
2.内涵
优点:
- 创建对象的高效方式:克隆一个对象比从头开始创建新对象要快得多。
- 降低系统的复杂性:通过消除创建新对象所需的复杂逻辑,原型设计模式简化了代码。
- 确保一致性:所有从原型创建的对象都具有相同的属性和行为,从而确保了一致性。
结构:
原型设计模式涉及以下主要参与者:
- 原型(Prototype):定义要克隆的对象的接口。
- 具体原型(ConcretePrototype):实现 Prototype 接口的具体类,表示要克隆的实际对象。
- 客户端(Client):使用 Prototype 接口创建新对象。
假设我们有一个形状绘制应用程序,它需要创建不同形状的对象。我们可以使用原型设计模式来克隆现有形状,而不是每次都需要时都从头创建形状。
3.使用示例
class Shape {
public:virtual Shape* clone() const = 0; // Clone method for creating copies.virtual void draw() const = 0; // Draw method for rendering the shape.virtual ~Shape() {} // Virtual destructor for proper cleanup.
};class Circle : public Shape {
private:double radius;public:Circle(double r) : radius(r) {}Shape* clone() const override {return new Circle(*this);}void draw() const override {std::cout << "Drawing a circle with radius " << radius << std::endl;}
};class Rectangle : public Shape {
private:double width;double height;public:Rectangle(double w, double h) : width(w), height(h) {}Shape* clone() const override {return new Rectangle(*this);}void draw() const override {std::cout << "Drawing a rectangle with width " << width << " and height " << height << std::endl;}
};main.cppCircle circlePrototype(5.0);
Rectangle rectanglePrototype(4.0, 6.0);Shape* shape1 = circlePrototype.clone();
Shape* shape2 = rectanglePrototype.clone();shape1->draw(); // Output: Drawing a circle with radius 5
shape2->draw(); // Output: Drawing a rectangle with width 4 and height 6
4.注意事项
在使用原型设计模式时需要注意以下事项:
- 对象的复杂性:原型设计模式最适合用于创建轻量级对象。如果对象很复杂,克隆它们的成本可能很高。
- 对象的引用:如果原型对象包含对其他对象的引用,则克隆对象时也需要克隆这些引用。这可能会导致创建对象图的开销很高。
- 不可变对象:如果原型对象是不可变的,则无法对其属性进行修改。在这种情况下,使用原型设计模式没有任何好处,因为创建的新对象将与原型完全相同。
- 多线程环境:在多线程环境中使用原型设计模式时,需要确保对原型对象的访问是线程安全的。否则,可能会导致数据损坏或其他问题。
- 性能考虑:克隆对象需要额外的处理时间和内存。在性能关键的应用程序中,需要权衡创建新对象与克隆现有对象之间的成本。
5.最佳实践
原型设计模式的最佳实践:
- 将原型对象存储在中央位置:这将使客户端可以轻松地访问原型,并有助于确保所有克隆对象都使用相同的原型。您可以使用单例模式来实现这一点。
- 使用工厂方法创建原型:这将允许您在需要时延迟创建原型。您可以使用一个工厂类来管理原型对象的创建。
- 只克隆必要的属性:如果原型对象包含大量数据,则应只克隆真正需要的数据。这将有助于减少内存开销和提高性能。您可以使用浅拷贝或深拷贝来实现这一点,具体取决于您的需求。
- 考虑多线程环境:在多线程环境中使用原型设计模式时,需要确保对原型对象的访问是线程安全的。您可以使用互斥锁或其他同步机制来实现这一点。
- 测试您的克隆:确保您的克隆对象与原型对象具有相同的状态和行为。您可以使用单元测试或其他测试技术来实现这一点。
6.总结
仅在需要创建大量相同对象时才使用原型设计模式,考虑使用对象池来管理克隆对象的创建和销毁,使用原型设计模式来创建不可变对象,以避免意外修改。
探索其他设计模式,例如工厂方法模式或单例模式,以了解它们如何与原型设计模式一起使用。通过遵循这些最佳实践,您可以有效且高效地使用原型设计模式来创建对象并提高应用程序的性能。
相关文章:
设计模式-13 - Prototype Design Pattern 原型设计模式
设计模式-13 - Prototype Design Pattern 原型设计模式 1.定义 原型设计模式是一种创建对象的方式,它通过复制一个现有的对象(原型)来创建一个新对象。 2.内涵 优点: 创建对象的高效方式:克隆一个对象比从头开始创建…...
05. 【Java教程】第一个 Java 程序
本节我们将以Windows操作系统为例,编写并执行第一个Java程序。在这之前,请确保你的操作系统上已经安装了JDK 1. 编译程序 大家可能有个疑问,为什么需要编译程序呢?计算机不能直接执行我们编写的源代码吗? 这是由于计…...
网易灵犀办公企业邮箱的IMAP和POP3服务器地址
IMAP 电子邮件地址:saleyouxiang.com 帐户类型:IMAP 接收邮件服务器:imaphz.qiye.163.com 发送邮件服务器:smtphz.qiye.163.com 用户名:saleyouxiang.comPOP3 电子邮件地址:saleyouxiang.com 帐户类型&…...
吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5
目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周:优化算法 (Optimization algorithms)2.3 指数加权平均数(Exponential…...
【正版系统】海外短剧系统功能介绍,前端uniapp+开源。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、海外短剧系统功能介绍 二、搭建要求 1.系统要求 总结 前言 短剧作为一种快速、紧凑的娱乐形式,正逐渐受到更多海外观众的喜爱。这种需求增长为…...
位图(c++)
文章目录 1.位图概念2.位图的实现3.应用(解决整形存在或次数问题)3.1存在问题3.2次数问题 5.搜索的方法对比: 1.位图概念 和哈希一样,都是一个表来记录某个元素的个数或者存在与否;不同的是哈希使用的计算机定义的完整…...
音源分离 | Hybrid Spectrogram and Waveform Source Separation
一、摘要 本文提出了基于Demucs架构的的时域频域的分离模型。提出的模型在2021年索尼组织的音乐分离挑战中获胜。该架构还包括其他改进,如压缩残差分支、局部注意力或奇异值正则化。 在MusDB HQ数据集上,所有源的信噪比(SDR)平均提…...
动态el-form表单以及动态禁用
当右侧下拉框选中为 长期有效,那么左侧输入框为禁用状态; <el-form-item label"证明有效期" class"is-required"><div v-for"(item,index) in form.arrayDat" :key"index" style"width: 100%;display: flex;justify-co…...
【Web后端】web后端开发简介_Servlet简介
1.web后端开发简介 Java企业级开发,也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态,简单了解即可web后端开发,基于B/S模式的开发体系。…...
Taylor Francis科技期刊数据库文献去哪里获取
一、Taylor & Francis科技期刊数据库简介: Taylor & Francis 科技期刊数据库(T&F ST Library)提供超过520种经专家评审的高质量科学与技术类期刊, 其中超过85%的期刊被Web of Science收录,内容最早至1997年。该科技期…...
C#学习笔记12:Winform网页操作-CefSharp内嵌浏览器
今日学习使用Winform操作网页,先从从窗体内嵌一个浏览器开始吧: 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 CefSharp介绍与安装: 创建解决方案安装CefSharp: 控件放置: 整体代码贴出: 更改…...
NSSCTF | [SWPUCTF 2021 新生赛]babyrce
打开题目,显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…...
环保不只是口号,绿葆自助取袋机助力1000多家医院环保行动!
2023年1月1日起,国家的“限塑令”范围进一步扩大,2023年6月20日起,《商务领域经营者使用、报告一次性塑料制品管理办法》开始实施。从国家到地方,对一次性塑料制品的污染问题治理正在越来越严格。为了响应国家环保政策并为患者提供…...
DELL服务器配置ILO(idrac)地址、修改管理员密码
服务器型号:DELL PowerEdge R630 1、重启服务器选择F2进入BIOS 2、重启服务器选择F2进入BIOS 3、选择“Network” 4、配置iDRAC的IP,掩码网关,DNS等信息 5、Esc返回,下滑选择“User Configuration” 6、配置iDRAC的用户名密码以及…...
如何打造个人IP?
打造个人IP(Intellectual Property)是当今社会中越来越受到关注的话题。个人IP指的是个人在某个领域内所拥有的独特的、具有商业价值的知识、技能、品牌和影响力。为什么要打造个人IP?如何打造个人IP?下面我将为您详细解答。 首先…...
【PostgreSQL支持中文的全文检索插件(zhparser)】
PostgreSQL本身是支持全文检索的,提供两个数据类型(tsvector,tsquery),并且通过动态检索自然语言文档的集合,定位到最匹配的查询结果。其内置的默认的分词解析器采用空格进行分词,但是因为中文的词语之间没…...
SHAP分析交互作用的功能,如果你用的模型是xgboost
SHAP分析交互作用的功能,如果你用的模型是xgboost 如果在SHAP分析中使用的是xgoost模型,就可以使用SHAP分析内置的交互作用分析,为分析变量间的相互提供了另外一个观察的视角。关于SHAP交互作用分析,一个参考资料,还是…...
瑞友科技质量改进服务事业部总经理张力受邀为第十三届中国PMO大会演讲嘉宾
全国PMO专业人士年度盛会 北京瑞友科技股份有限公司质量改进服务事业部总经理张力先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“PMO如何对接战略成为企业IT投资成功的有效保障”。大会将于6月29-30日在北京举办,敬请关注&#x…...
CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷
分析 CVE-2024-4761 和 POC 代码 CVE-2024-4761 描述 CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞,报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏,进而导致程序崩溃或其他不安全行为。 POC 代码解…...
字符串函数(二):strlen(求长度),strstr(查找子串),strtok(分割),strerror(打印错误信息)
字符串函数 一.strlen(求字符串长度)1.函数使用2.模拟实现(三种方法) 二.strstr(字符串查找子串)1.函数使用2.模拟实现 三.strtok(字符串分割)四.strerror,perror&#x…...
利用快马平台快速生成stm32的i2c oled显示驱动原型
最近在做一个嵌入式小项目,需要用到STM32的I2C总线驱动OLED显示屏。作为嵌入式开发新手,我原本以为要花好几天时间才能搞定这个功能模块,没想到用InsCode(快马)平台很快就生成了可用的原型代码。下面分享下我的实践过程: I2C总线…...
嵌入式视觉实战2——基于MaixCAM与PP-OCR的智能门禁车牌识别系统
1. MaixCAM与PP-OCR的完美组合 第一次接触MaixCAM时,我就被这个小巧的视觉模块惊艳到了。它内置的RISC-V处理器跑着完整的Linux系统,这意味着我们可以直接在上面部署各种AI模型,而不用像传统单片机那样从零开始搭建开发环境。最让我惊喜的是&…...
DeOldify模型压缩与量化教程:适配边缘计算设备部署
DeOldify模型压缩与量化教程:适配边缘计算设备部署 想让老照片在手机上瞬间焕发色彩吗?DeOldify模型以其出色的黑白照片上色效果而闻名,但它的“体重”对于手机、树莓派这类边缘设备来说,可能有点“超重”了。直接部署原版模型&a…...
如何在5分钟内为Unity游戏添加实时翻译:XUnity.AutoTranslator完整指南
如何在5分钟内为Unity游戏添加实时翻译:XUnity.AutoTranslator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏的语言障碍而烦恼吗?XUnity.AutoTranslator是…...
Qwen3-ForcedAligner-0.6B在智能家居场景中的语音指令对齐应用
Qwen3-ForcedAligner-0.6B:让智能家居听懂你的每一句话 你有没有过这样的经历?对着家里的智能音箱喊“打开客厅的灯”,它却给你打开了卧室的空调。或者你说“把温度调到25度”,它却回答“好的,正在播放音乐”。这种鸡…...
同事在字节干了 6 年,攒了不少钱但身体垮了。体检查出一堆毛病,医生说得休息。请了一个月假,以前觉得赚钱重要,现在觉得活着重要!
最近刷到一个扎心帖子:贴主的前同事在字节干了 6 年,攒下了不少钱,却也熬垮了身体。一次体检查出一堆问题,医生直接下了“必须休息”的最后通牒。他请了一个月长假,在医院躺了几天后彻底想通了:以前觉得赚钱…...
别再纠结了!用Qt开发桌面应用,QWidget和QML到底怎么选?(附实战场景分析)
Qt技术选型实战:QWidget与QML的深度决策指南 当你启动一个新的Qt桌面应用项目时,第一个技术决策往往最令人纠结——该选择传统的QWidget还是现代的QML?这个选择不仅影响开发效率,更决定了产品的长期维护成本和用户体验品质。作为经…...
OpenClaw学术助手搭建:gemma-3-12b-it自动生成论文阅读报告
OpenClaw学术助手搭建:gemma-3-12b-it自动生成论文阅读报告 1. 为什么需要自动化论文阅读助手 作为一名计算机视觉方向的研究生,我每天需要跟踪至少3-5篇arXiv最新论文。传统的手动阅读方式效率低下:下载PDF、跳读摘要、标记重点、整理笔记…...
Sterpi饱和渗透试验及非饱和潜蚀试验模型 [1]模型简介:使用数值模拟软件COMSOL
Sterpi饱和渗透试验及非饱和潜蚀试验模型 [1]模型简介:使用数值模拟软件COMSOL,复现一区TOP论文(Yang J ,Yin Z ,Laouafa F , et al.Modeling coupled erosion and filtration of fine particles in granular media[J].Acta Geotechnica,2019,14(6):1615…...
OpenClaw长期运行方案:Phi-3-mini-128k-instruct服务的稳定性保障
OpenClaw长期运行方案:Phi-3-mini-128k-instruct服务的稳定性保障 1. 为什么需要长期运行方案? 去年冬天的一个深夜,我被手机警报惊醒——部署在家庭服务器的OpenClaw服务崩溃了。当时正在运行的自动化周报生成任务因此中断,导致…...
