03_23 种设计模式之《原型模式》
文章目录
- 一、原型模式基础知识
- 原型模式的结构
- 应用场景
- 实例
- 拷贝构造函数被调用场景如下:
- 典型的应用场景:
一、原型模式基础知识
原型模式是一种创建型设计模式,其功能为复制一个运行时的对象,包括对象各个成员当前的值。而代码又能保持独立性。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决:在运行期建立和删除原型。
优点:性能提高、避免构造函数的约束。
原型模式的结构
原型接口(Prototype Interface):通常包含一个克隆自己的方法。
具体原型类(Concrete Prototype):实现原型接口,提供克隆自身的具体实现。
客户端(Client):让一个原型克隆自身,并对克隆体进行修改。
应用场景
原型模式适用于以下情况:
创建新对象成本较大:如果创建对象的过程非常复杂或者资源消耗较大,使用原型模式可以避免这些开销。
需要保留对象的历史状态:原型模式可以很容易地复制对象的状态,适用于需要回溯对象状态的场景。
当系统需要避免创建多个相同对象时:如果系统频繁创建相同或相似的对象,使用原型模式可以提高效率。
实例
#include <iostream>
using namespace std;class ProtoType { // 凡是含有纯虚函数的类叫做抽象类
public:ProtoType(){}~ProtoType() {}virtual ProtoType* CloneFunc() = 0; // 纯虚函数
};class ConreteProtoType:public ProtoType
{
public:ConreteProtoType(int imember):_member(imember) {cout << "执行ConreteProtoType带参构造函数.\n" << endl;}~ConreteProtoType() {cout << "执行ConreteProtoType析构函数." << endl;}// 拷贝构造函数(若有指针成员变量,要进行实现深拷贝)ConreteProtoType(const ConreteProtoType& rhs) {_member = rhs._member;cout << "数据成员_member1:" << _member << endl;}ConreteProtoType* CloneFunc() { // 派生类实现cout << "正在处理克隆." << endl;cout << "数据成员_member2:" << _member << endl;return new ConreteProtoType(*this);}private:int _member;};int main()
{cout << "main()函数-->原型模式开始.\n" << endl;ConreteProtoType* CloneObjA = new ConreteProtoType(88);ConreteProtoType* CloneObjB = CloneObjA->CloneFunc();cout << endl;delete CloneObjA;CloneObjA = nullptr;delete CloneObjB;CloneObjB = nullptr;return 0;
}
main函数-->原型模式开始
ConcretePrototype带参构造函数
正处理克隆
数据成员_member2:88
数据成员_member1:88
ConcretePrototype析构函数
ConcretePrototype析构函数
main函数-->原型模式结束
拷贝构造函数被调用场景如下:
1、用已知对象初始化一个正在被创建的对象,调用拷贝构造函数;
2、函数形式参数为对象的时候,实参对象向形参对象传递,调用
拷贝构造函数。
3、函数的返回值为对象的时候,当需要获取返回值时,调用拷贝
构造函数
典型的应用场景:
-
报表生成:在报表系统中,用户可以创建并保存各种报表模板,当需要生成报表时,可以直接克隆这些模板,而不需要重新设置复杂的配置信息。
-
游戏角色复制:在游戏开发中,可以通过原型模式复制角色,快速生成大量相似的游戏对象,如士兵、怪物等。
-
复杂对象的快速创建:当对象的创建过程非常复杂或者耗时较长时,可以通过原型模式复制已有对象来避免重复的创建过程,如从数据库加载大量数据的对象。
-
对象的深克隆:在需要对象副本并且希望副本与原对象完全独立时,可以使用原型模式进行深克隆,这在对象包含复杂引用结构时非常有用。
-
原型注册表:在某些系统中,可以维护一个原型注册表,里面存储了各种类型的原型对象。当需要创建对象时,直接从注册表中克隆原型对象,这样可以提高对象创建的效率。
-
配置对象的复制:在配置管理系统中,可以通过原型模式复制配置对象,快速生成新的配置实例,而不需要重新解析配置文件。
-
设计模式的动态加载:在需要动态加载设计模式对象的情况下,可以使用原型模式来创建对象,这样可以避免直接实例化类,提高系统的灵活性和可扩展性。
-
用户界面克隆:在用户界面设计中,可以通过原型模式复制界面元素,如按钮、菜单等,这样可以快速创建多个相似的界面元素。
-
数据备份:在需要备份大量数据时,可以使用原型模式创建数据的副本,这样可以避免数据的重复输入,提高数据备份的效率。
-
实验和模拟:在科学计算和工程设计中,原型模式可以用来复制实验设置或模拟环境,以便进行多次独立的实验或模拟。
通过使用原型模式,可以提高对象创建的效率,减少系统的资源消耗,并提高代码的可维护性和可扩展性。
相关文章:
03_23 种设计模式之《原型模式》
文章目录 一、原型模式基础知识原型模式的结构应用场景 实例拷贝构造函数被调用场景如下:典型的应用场景: 一、原型模式基础知识 原型模式是一种创建型设计模式,其功能为复制一个运行时的对象,包括对象各个成员当前的值。而代码又…...
【秋招笔试】10.08华为荣耀秋招(已改编)-三语言题解
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...
基于ResNet50模型的船型识别与分类系统研究
关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…...
一个为分布式环境设计的任务调度与重试平台,高灵活高效率,系统安全便捷,分布式重试杀器!(附源码)
背景 近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天,我们经常需要对某个数据请求进行多次尝试。然而,当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时,请求…...
攻防世界(CTF)~Misc-Banmabanma
题目介绍 附件下载后得到一张图片类,似一只斑马,仔细观看发现像条形码 用条形码在线阅读查看一下 条形码在线识别 flag{TENSHINE}...
获取淘宝直播间弹幕数据的技术探索实践方法
在数字时代,直播已成为电商营销的重要渠道之一,而弹幕作为直播互动的核心元素,蕴含着丰富的用户行为和情感数据。本文将详细介绍如何获取淘宝直播间弹幕数据的技术方法和步骤,同时分析不同工具和方法的优缺点,并提供实…...
Python 卸载所有的包
Python 卸载所有的包 引言正文 引言 可能很少有小伙伴会遇到这个问题,当我们错误安装了一些包后,由于包之间有相互关联,导致一些已经安装的包无法使用,而由于我们已经安装了很多包,它们的名字我们并不完全知道&#x…...
JWT(JSON Web Token)、Token、Session和Cookie
JWT(JSON Web Token)、Token、Session和Cookie都是Web开发中常用的概念,它们各自在不同的场景下发挥着重要的作用。以下是对这四个概念的详细解释和比较: 一、JWT(JSON Web Token) 定义:JWT是一…...
国内知名人工智能AI大模型专家培训讲师唐兴通讲授AI办公应用人工智能在营销与销售过程中如何应用数字化赋能
AI如火如荼,对商业与社会影响很大。 目前企业广泛应用主要是在营销、销售方向,提升办公效率等方向。 从喧嚣的AI导入营销与销售初步阶段,那么当下,领先的组织与个人现在正在做什么呢? 如何让人性注入冷冰冰的AI&…...
Android常用C++特性之std::swap
声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。 std::swap 是 C 标准库中提供的一个函数,位于 <utility> 头文件中。它用于交换两个变量的值。 语法: #include <utility>std::s…...
MongoDB数据库详解:特点、架构与应用场景
目录 MongoDB 简介MongoDB 的核心特点 2.1 面向文档的存储2.2 动态架构2.3 水平扩展能力2.4 强大的查询能力 MongoDB 的架构设计 3.1 存储引擎3.2 集群架构3.3 副本集(Replica Set)3.4 分片(Sharding) MongoDB 常见应用场景 4.1 …...
【C语言刷力扣】1678.设计Goal解析器
题目: 解题思路: 遍历分析每一个字符,对不同情况分别讨论。 若是字符 G ,则 res 中添加字符 G若是字符 ( ,则再分别讨论。 若下一个字符是 ), 则在 res 末尾添加字符 o若下一个字符…...
RK3568平台开发系列讲解(I2C篇)i2c 总线驱动介绍
🚀返回专栏总目录 文章目录 一、i2c 总线定义二、i2c 总线注册三、i2c 设备和 i2c 驱动匹配规则沉淀、分享、成长,让自己和他人都能有所收获!😄 i2c 总线驱动由芯片厂商提供,如果我们使用 ST 官方提供的 Linux 内核, i2c 总线驱动已经保存在内核中,并且默认情况下已经…...
xilinx中bufgce
在Xilinx的FPGA设计中,BUFGCE是一种重要的全局时钟缓冲器原语,它基于BUFGCTRL并以一些引脚连接逻辑高电位和低电位。以下是对BUFGCE的详细解析: 一、BUFGCE的功能与特点 功能:BUFGCE是带有时钟使能信号的全局缓冲器。它接收一个时…...
雷池+frp 批量设置proxy_protocol实现真实IP透传
需求 内网部署safeline,通过frp让外网访问内部web网站服务,让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器:192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…...
DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合
回溯算法基础知识 一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。 回溯算法解决的问题有: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数…...
js基础速成12-正则表达式
正则表达式 正则表达式(Regular Expression)或 RegExp 是一种小型编程语言,有助于在数据中查找模式。RegExp 可以用来检查某种模式是否存在于不同的数据类型中。在 JavaScript 中使用 RegExp,可以使用 RegExp 构造函数࿰…...
使用Selenium自动化测试定位iframe以及修改img标签的display属性值
在使用 Selenium 进行自动化测试时,处理 iframe 是一个常见问题。当页面中出现 iframe 时,需要先切换到该 iframe 内部,才能正常定位和操作其中的元素。以下是处理 iframe 的步骤和示例代码: 步骤 切换到 iframe:使用…...
DAY13
面试遇到的新知识点 char str[10],只有10个字符的空间,但是只能存储9个字符,最后一个字符用来存储终止符\0 strlen只会计算\n,不会计算\0 值传递: void test2(char * str) {str "hello\n"; }int main() {char * str;test2(str);…...
WPF 自定义用户控件(Content根据加减按钮改变值)
前端代码: <UserControl.Resources><Style x:Key"Num_Button_Style" TargetType"Button"><Setter Property"MinWidth" Value"30" /><Setter Property"Height" Value"35" />&l…...
STM32CubeMX实战指南:DMA驱动USART高效数据传输
1. DMA与USART协作的核心价值 第一次接触STM32的DMA功能时,我正被一个传感器数据采集项目折磨得焦头烂额。当时用传统的中断方式处理串口数据,CPU占用率直接飙到70%,整个系统卡得像老式拨号上网。直到尝试了DMAUSART组合,才真正体…...
告别默认样式:C# WinForm自定义最大化最小化关闭按钮实战(含资源文件管理技巧)
深度定制WinForm界面:从按钮替换到资源管理的完整解决方案 1. 为什么需要自定义窗体控制按钮? 在商业软件和创意应用中,用户界面的视觉体验往往决定了用户对产品的第一印象。WinForm作为.NET生态中成熟的桌面应用框架,其默认的窗体…...
终极Cinder着色器编程指南:7个GLSL视觉效果开发技巧
终极Cinder着色器编程指南:7个GLSL视觉效果开发技巧 【免费下载链接】Cinder Cinder is a community-developed, free and open source library for professional-quality creative coding in C. 项目地址: https://gitcode.com/gh_mirrors/ci/Cinder Cinder…...
C++手动实现共享智能指针my_shared_ptr|引用计数+删除器+完整可运行代码
1.共享智能指针的概念 共享型智能指针就是做出一个像JAVA中垃圾回收器,并且可以运用到所有资源,heap内存和系统资源都可以使用的系统。 shared_ptr实现了共享所有权(shared ownership)方式来管理资源对象,这意味没有一个特定的shared_ptr拥有资源对象。相反,这些指向同一…...
Phi-4-mini-reasoning部署教程:多模型共存时GPU显存隔离配置技巧
Phi-4-mini-reasoning部署教程:多模型共存时GPU显存隔离配置技巧 1. 模型介绍 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型主打"小参数、强推理、长上下文、低延迟&quo…...
AUC 的两种等价定义:从排序概率到 ROC 曲线的统一理解
一、AUC 的本质:一个排序概率1. 问题设定假设我们面对的是一个二分类 / 排序问题:每个样本 �� 有真实标签 ��∈0,1模型给出一个连续预测分数 ��∈�分数越大,模…...
零克云联合创始人占冰强:如何借助OpenClaw为企业AI变革提速!
3月28日,由MoltBank&聚鲸科技、AIGCLink联合主办的“赢在OpenClaw北京站”闭门分享会,在北京成功举行。本次活动聚焦AI Agent落地、AI商业场景落地、AI法律合规边界等关键议题。在演讲环节,零克云联合创始人兼COO占冰强分享了:…...
零基础掌握LunaTranslator:视觉小说翻译工具全流程实战指南
零基础掌握LunaTranslator:视觉小说翻译工具全流程实战指南 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator LunaTranslator作为一款专注于视觉小说翻译的开源…...
避坑指南:深度相机与RGB相机标定中的5个常见错误
避坑指南:深度相机与RGB相机标定中的5个常见错误 在三维重建和增强现实开发中,深度相机与RGB相机的联合标定是基础却极易出错的关键环节。许多开发者投入大量时间调试标定结果,却因忽视了一些看似简单的细节而功亏一篑。本文将揭示五个最常被…...
Pixel Aurora Engine效果展示:像素极光系统生成的赛博忍者角色系列
Pixel Aurora Engine效果展示:像素极光系统生成的赛博忍者角色系列 1. 像素极光引擎简介 Pixel Aurora(像素极光)是一款基于AI扩散模型的高端绘图工作站,采用独特的复古像素游戏风格界面设计。这款工具将现代AI技术与经典8-bit美…...
