当前位置: 首页 > 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…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...