当前位置: 首页 > news >正文

设计模式-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.定义 原型设计模式是一种创建对象的方式&#xff0c;它通过复制一个现有的对象&#xff08;原型&#xff09;来创建一个新对象。 2.内涵 优点&#xff1a; 创建对象的高效方式&#xff1a;克隆一个对象比从头开始创建…...

05. 【Java教程】第一个 Java 程序

本节我们将以Windows操作系统为例&#xff0c;编写并执行第一个Java程序。在这之前&#xff0c;请确保你的操作系统上已经安装了JDK 1. 编译程序 大家可能有个疑问&#xff0c;为什么需要编译程序呢&#xff1f;计算机不能直接执行我们编写的源代码吗&#xff1f; 这是由于计…...

网易灵犀办公企业邮箱的IMAP和POP3服务器地址

IMAP 电子邮件地址&#xff1a;saleyouxiang.com 帐户类型&#xff1a;IMAP 接收邮件服务器&#xff1a;imaphz.qiye.163.com 发送邮件服务器&#xff1a;smtphz.qiye.163.com 用户名&#xff1a;saleyouxiang.comPOP3 电子邮件地址&#xff1a;saleyouxiang.com 帐户类型&…...

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.3 指数加权平均数&#xff08;Exponential…...

【正版系统】海外短剧系统功能介绍,前端uniapp+开源。

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、海外短剧系统功能介绍 二、搭建要求 1.系统要求 总结 前言 短剧作为一种快速、紧凑的娱乐形式&#xff0c;正逐渐受到更多海外观众的喜爱。这种需求增长为…...

位图(c++)

文章目录 1.位图概念2.位图的实现3.应用&#xff08;解决整形存在或次数问题&#xff09;3.1存在问题3.2次数问题 5.搜索的方法对比&#xff1a; 1.位图概念 和哈希一样&#xff0c;都是一个表来记录某个元素的个数或者存在与否&#xff1b;不同的是哈希使用的计算机定义的完整…...

音源分离 | Hybrid Spectrogram and Waveform Source Separation

一、摘要 本文提出了基于Demucs架构的的时域频域的分离模型。提出的模型在2021年索尼组织的音乐分离挑战中获胜。该架构还包括其他改进&#xff0c;如压缩残差分支、局部注意力或奇异值正则化。 在MusDB HQ数据集上&#xff0c;所有源的信噪比&#xff08;SDR&#xff09;平均提…...

动态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企业级开发&#xff0c;也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态&#xff0c;简单了解即可web后端开发&#xff0c;基于B/S模式的开发体系。…...

Taylor Francis科技期刊数据库文献去哪里获取

一、Taylor & Francis科技期刊数据库简介&#xff1a; Taylor & Francis 科技期刊数据库&#xff08;T&F ST Library&#xff09;提供超过520种经专家评审的高质量科学与技术类期刊, 其中超过85%的期刊被Web of Science收录&#xff0c;内容最早至1997年。该科技期…...

C#学习笔记12:Winform网页操作-CefSharp内嵌浏览器

今日学习使用Winform操作网页&#xff0c;先从从窗体内嵌一个浏览器开始吧&#xff1a; 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 CefSharp介绍与安装&#xff1a; 创建解决方案安装CefSharp&#xff1a; 控件放置&#xff1a; 整体代码贴出&#xff1a; 更改…...

NSSCTF | [SWPUCTF 2021 新生赛]babyrce

打开题目&#xff0c;显示了一个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日起&#xff0c;国家的“限塑令”范围进一步扩大&#xff0c;2023年6月20日起&#xff0c;《商务领域经营者使用、报告一次性塑料制品管理办法》开始实施。从国家到地方&#xff0c;对一次性塑料制品的污染问题治理正在越来越严格。为了响应国家环保政策并为患者提供…...

DELL服务器配置ILO(idrac)地址、修改管理员密码

服务器型号&#xff1a;DELL PowerEdge R630 1、重启服务器选择F2进入BIOS 2、重启服务器选择F2进入BIOS 3、选择“Network” 4、配置iDRAC的IP&#xff0c;掩码网关&#xff0c;DNS等信息 5、Esc返回&#xff0c;下滑选择“User Configuration” 6、配置iDRAC的用户名密码以及…...

如何打造个人IP?

打造个人IP&#xff08;Intellectual Property&#xff09;是当今社会中越来越受到关注的话题。个人IP指的是个人在某个领域内所拥有的独特的、具有商业价值的知识、技能、品牌和影响力。为什么要打造个人IP&#xff1f;如何打造个人IP&#xff1f;下面我将为您详细解答。 首先…...

【PostgreSQL支持中文的全文检索插件(zhparser)】

PostgreSQL本身是支持全文检索的&#xff0c;提供两个数据类型&#xff08;tsvector,tsquery&#xff09;&#xff0c;并且通过动态检索自然语言文档的集合&#xff0c;定位到最匹配的查询结果。其内置的默认的分词解析器采用空格进行分词&#xff0c;但是因为中文的词语之间没…...

SHAP分析交互作用的功能,如果你用的模型是xgboost

SHAP分析交互作用的功能&#xff0c;如果你用的模型是xgboost 如果在SHAP分析中使用的是xgoost模型&#xff0c;就可以使用SHAP分析内置的交互作用分析&#xff0c;为分析变量间的相互提供了另外一个观察的视角。关于SHAP交互作用分析&#xff0c;一个参考资料&#xff0c;还是…...

瑞友科技质量改进服务事业部总经理张力受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 北京瑞友科技股份有限公司质量改进服务事业部总经理张力先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMO如何对接战略成为企业IT投资成功的有效保障”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#x…...

CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷

分析 CVE-2024-4761 和 POC 代码 CVE-2024-4761 描述 CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞&#xff0c;报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏&#xff0c;进而导致程序崩溃或其他不安全行为。 POC 代码解…...

字符串函数(二):strlen(求长度),strstr(查找子串),strtok(分割),strerror(打印错误信息)

字符串函数 一.strlen&#xff08;求字符串长度&#xff09;1.函数使用2.模拟实现&#xff08;三种方法&#xff09; 二.strstr&#xff08;字符串查找子串&#xff09;1.函数使用2.模拟实现 三.strtok&#xff08;字符串分割&#xff09;四.strerror&#xff0c;perror&#x…...

学习大模型RAG与Agent智能体基础知识day1

开头 各位好啊&#xff01; 如你所见博主是个新手&#xff0c;新到这是我第一次发博客。 现在是2026.5.20的凌晨&#xff08;哦情人节到了…&#xff09;&#xff0c;前几周刚刚学完langchain的基础知识&#xff0c;跟着教程做了个前后端&#xff08;前端因为没学所以代码直接搬…...

4.0修复版去水印小程序源码 内含去水印免费接口

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 流量主变现&#xff1a;集成微信广告&#xff0c;支持开屏 / 激励 / Banner 广告&#xff0c;直接盈利。 前后端能力&#xff1a; 前端&#xff1a;3 套 UI 可选&#xff0c;改版后功能完…...

OpenAvatarChat终极指南:5分钟打造你的专属AI数字人

OpenAvatarChat终极指南&#xff1a;5分钟打造你的专属AI数字人 【免费下载链接】OpenAvatarChat 项目地址: https://gitcode.com/gh_mirrors/op/OpenAvatarChat 想象一下&#xff0c;你正在开发一个智能客服系统&#xff0c;需要让数字人能够自然流畅地与用户对话。传…...

3分钟快速检测微信单向好友:告别隐形社交困扰的实用指南

3分钟快速检测微信单向好友&#xff1a;告别隐形社交困扰的实用指南 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends …...

CG-75B 七参数微型气象传感器 超声波测量原理 集成 一体化

产品概述七参数微型气象传感器是一款利用发送的声波脉冲&#xff0c;基于超声波原理研发的风速风向测量仪器&#xff0c;测量接收端的时间或频率&#xff08;多普勒变换&#xff09;差别来计算风速和风向。该传感器可以同时测量风速&#xff0c;风向的瞬时数值&#xff0c;支持…...

为什么92%的Lovable新手在第5小时放弃?——资深架构师拆解3个致命认知盲区

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Lovable应用开发入门与环境搭建 Lovable 是一个面向现代 Web 应用的轻量级全栈框架&#xff0c;专为快速构建可维护、可扩展且富有表现力的交互式应用而设计。它融合了声明式 UI、响应式状态管理与内置服务抽…...

git常用使用命令(亲测,可以,自己的笔记)

一本 官方中文版 书分享给大家&#xff08;说明&#xff1a;本人多次阅读&#xff0c;体会是容易入门&#xff0c;读起来很顺手&#xff0c;但是讲的不深入&#xff09; https://git-scm.com/book/zh/v2 一、git官方使用命令&#xff1a; usage: git [--version] [--help] [-C…...

软件许可优化,别被销售忽悠了,看看这几家到底谁管用

以前我们公司被Adobe审计过一次&#xff0c;赔了不少钱。之后老板让我专门研究软件许可优化这件事。市面上这几家都聊过、试过&#xff0c;我把真实感受跟你说说。先说你可能不太熟的&#xff1a;&#xff08;gofarlic&#xff09;这家是国内武汉的&#xff0c;一开始我也有点怀…...

BedRock缓存一致性协议:无瞬态状态设计与验证优化

1. BedRock缓存一致性协议概述在现代多核处理器架构中&#xff0c;缓存一致性协议是确保多个处理器核心能够正确访问共享内存数据的关键机制。BedRock协议作为一种创新的目录式缓存一致性解决方案&#xff0c;通过独特的架构设计显著降低了传统协议面临的实现复杂度和验证难度。…...

Whisky革新指南:在macOS上优雅运行Windows程序的全新体验

Whisky革新指南&#xff1a;在macOS上优雅运行Windows程序的全新体验 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 你是否曾经在macOS上渴望运行某个Windows专用软件&#xff0c;却…...