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

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、函数的返回值为对象的时候,当需要获取返回值时,调用拷贝
构造函数

典型的应用场景:

  1. 报表生成:在报表系统中,用户可以创建并保存各种报表模板,当需要生成报表时,可以直接克隆这些模板,而不需要重新设置复杂的配置信息。

  2. 游戏角色复制:在游戏开发中,可以通过原型模式复制角色,快速生成大量相似的游戏对象,如士兵、怪物等。

  3. 复杂对象的快速创建:当对象的创建过程非常复杂或者耗时较长时,可以通过原型模式复制已有对象来避免重复的创建过程,如从数据库加载大量数据的对象。

  4. 对象的深克隆:在需要对象副本并且希望副本与原对象完全独立时,可以使用原型模式进行深克隆,这在对象包含复杂引用结构时非常有用。

  5. 原型注册表:在某些系统中,可以维护一个原型注册表,里面存储了各种类型的原型对象。当需要创建对象时,直接从注册表中克隆原型对象,这样可以提高对象创建的效率。

  6. 配置对象的复制:在配置管理系统中,可以通过原型模式复制配置对象,快速生成新的配置实例,而不需要重新解析配置文件。

  7. 设计模式的动态加载:在需要动态加载设计模式对象的情况下,可以使用原型模式来创建对象,这样可以避免直接实例化类,提高系统的灵活性和可扩展性。

  8. 用户界面克隆:在用户界面设计中,可以通过原型模式复制界面元素,如按钮、菜单等,这样可以快速创建多个相似的界面元素。

  9. 数据备份:在需要备份大量数据时,可以使用原型模式创建数据的副本,这样可以避免数据的重复输入,提高数据备份的效率。

  10. 实验和模拟:在科学计算和工程设计中,原型模式可以用来复制实验设置或模拟环境,以便进行多次独立的实验或模拟。

通过使用原型模式,可以提高对象创建的效率,减少系统的资源消耗,并提高代码的可维护性和可扩展性。

相关文章:

03_23 种设计模式之《原型模式》

文章目录 一、原型模式基础知识原型模式的结构应用场景 实例拷贝构造函数被调用场景如下&#xff1a;典型的应用场景&#xff1a; 一、原型模式基础知识 原型模式是一种创建型设计模式&#xff0c;其功能为复制一个运行时的对象&#xff0c;包括对象各个成员当前的值。而代码又…...

【秋招笔试】10.08华为荣耀秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

基于ResNet50模型的船型识别与分类系统研究

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…...

一个为分布式环境设计的任务调度与重试平台,高灵活高效率,系统安全便捷,分布式重试杀器!(附源码)

背景 近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天&#xff0c;我们经常需要对某个数据请求进行多次尝试。然而&#xff0c;当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时&#xff0c;请求…...

攻防世界(CTF)~Misc-Banmabanma

题目介绍 附件下载后得到一张图片类&#xff0c;似一只斑马&#xff0c;仔细观看发现像条形码 用条形码在线阅读查看一下 条形码在线识别 flag{TENSHINE}...

获取淘宝直播间弹幕数据的技术探索实践方法

在数字时代&#xff0c;直播已成为电商营销的重要渠道之一&#xff0c;而弹幕作为直播互动的核心元素&#xff0c;蕴含着丰富的用户行为和情感数据。本文将详细介绍如何获取淘宝直播间弹幕数据的技术方法和步骤&#xff0c;同时分析不同工具和方法的优缺点&#xff0c;并提供实…...

Python 卸载所有的包

Python 卸载所有的包 引言正文 引言 可能很少有小伙伴会遇到这个问题&#xff0c;当我们错误安装了一些包后&#xff0c;由于包之间有相互关联&#xff0c;导致一些已经安装的包无法使用&#xff0c;而由于我们已经安装了很多包&#xff0c;它们的名字我们并不完全知道&#x…...

JWT(JSON Web Token)、Token、Session和Cookie

JWT&#xff08;JSON Web Token&#xff09;、Token、Session和Cookie都是Web开发中常用的概念&#xff0c;它们各自在不同的场景下发挥着重要的作用。以下是对这四个概念的详细解释和比较&#xff1a; 一、JWT&#xff08;JSON Web Token&#xff09; 定义&#xff1a;JWT是一…...

国内知名人工智能AI大模型专家培训讲师唐兴通讲授AI办公应用人工智能在营销与销售过程中如何应用数字化赋能

AI如火如荼&#xff0c;对商业与社会影响很大。 目前企业广泛应用主要是在营销、销售方向&#xff0c;提升办公效率等方向。 从喧嚣的AI导入营销与销售初步阶段&#xff0c;那么当下&#xff0c;领先的组织与个人现在正在做什么呢&#xff1f; 如何让人性注入冷冰冰的AI&…...

Android常用C++特性之std::swap

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::swap 是 C 标准库中提供的一个函数&#xff0c;位于 <utility> 头文件中。它用于交换两个变量的值。 语法&#xff1a; #include <utility>std::s…...

MongoDB数据库详解:特点、架构与应用场景

目录 MongoDB 简介MongoDB 的核心特点 2.1 面向文档的存储2.2 动态架构2.3 水平扩展能力2.4 强大的查询能力 MongoDB 的架构设计 3.1 存储引擎3.2 集群架构3.3 副本集&#xff08;Replica Set&#xff09;3.4 分片&#xff08;Sharding&#xff09; MongoDB 常见应用场景 4.1 …...

【C语言刷力扣】1678.设计Goal解析器

题目&#xff1a; 解题思路&#xff1a; 遍历分析每一个字符&#xff0c;对不同情况分别讨论。 若是字符 G &#xff0c;则 res 中添加字符 G若是字符 &#xff08; &#xff0c;则再分别讨论。 若下一个字符是 &#xff09;&#xff0c; 则在 res 末尾添加字符 o若下一个字符…...

RK3568平台开发系列讲解(I2C篇)i2c 总线驱动介绍

🚀返回专栏总目录 文章目录 一、i2c 总线定义二、i2c 总线注册三、i2c 设备和 i2c 驱动匹配规则沉淀、分享、成长,让自己和他人都能有所收获!😄 i2c 总线驱动由芯片厂商提供,如果我们使用 ST 官方提供的 Linux 内核, i2c 总线驱动已经保存在内核中,并且默认情况下已经…...

xilinx中bufgce

在Xilinx的FPGA设计中&#xff0c;BUFGCE是一种重要的全局时钟缓冲器原语&#xff0c;它基于BUFGCTRL并以一些引脚连接逻辑高电位和低电位。以下是对BUFGCE的详细解析&#xff1a; 一、BUFGCE的功能与特点 功能&#xff1a;BUFGCE是带有时钟使能信号的全局缓冲器。它接收一个时…...

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline&#xff0c;通过frp让外网访问内部web网站服务&#xff0c;让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器&#xff1a;192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…...

DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合

回溯算法基础知识 一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。 回溯算法解决的问题有&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数…...

js基础速成12-正则表达式

正则表达式 正则表达式&#xff08;Regular Expression&#xff09;或 RegExp 是一种小型编程语言&#xff0c;有助于在数据中查找模式。RegExp 可以用来检查某种模式是否存在于不同的数据类型中。在 JavaScript 中使用 RegExp&#xff0c;可以使用 RegExp 构造函数&#xff0…...

使用Selenium自动化测试定位iframe以及修改img标签的display属性值

在使用 Selenium 进行自动化测试时&#xff0c;处理 iframe 是一个常见问题。当页面中出现 iframe 时&#xff0c;需要先切换到该 iframe 内部&#xff0c;才能正常定位和操作其中的元素。以下是处理 iframe 的步骤和示例代码&#xff1a; 步骤 切换到 iframe&#xff1a;使用…...

DAY13

面试遇到的新知识点 char str[10],只有10个字符的空间&#xff0c;但是只能存储9个字符&#xff0c;最后一个字符用来存储终止符\0 strlen只会计算\n,不会计算\0 值传递&#xff1a; void test2(char * str) {str "hello\n"; }int main() {char * str;test2(str);…...

WPF 自定义用户控件(Content根据加减按钮改变值)

前端代码&#xff1a; <UserControl.Resources><Style x:Key"Num_Button_Style" TargetType"Button"><Setter Property"MinWidth" Value"30" /><Setter Property"Height" Value"35" />&l…...

CPU、GPU、显卡

CPU VS GPUCPU&#xff08;Central Processing Unit&#xff09;&#xff0c;中央处理器GPU&#xff08;Graphics Processing Unit&#xff09;&#xff0c;图形处理单元GPU 的技术演变CUDA&#xff08;Compute Unified Device Architecture&#xff09; 显卡&#xff08;Video…...

深入理解 Django 自定义用户模型

1. 引言 Django 作为一个强大的 Web 框架&#xff0c;内置了用户认证系统。然而&#xff0c;实际项目中我们通常需要扩展用户模型&#xff0c;以满足不同的业务需求。Django 提供了继承 AbstractUser 的方式&#xff0c;让我们能够轻松地定制用户模型。本文将通过一个自定义用…...

顺序表和链表的区别

顺序表和链表的区别 不同点顺序表链表&#xff08;带头双向循环&#xff09;存储空间物理上一定连续逻辑上连续物理上不一定连续随机访问&#xff08;用下标随机访问&#xff09;支持&#xff1a;O(1)不支持&#xff1a;O(N)任意位置插入或者删除元素可能需要搬移元素&#xf…...

系分-数据库总结

历年试题2024年05月试题 BCN范式&#xff0c;模式分解&#xff0c;触发器类型2023年05月试题 NoSQL基本特点&#xff0c;NoSQL对比&#xff0c;混合数据库2022年05月试题4 两段锁&#xff0c;事务并发&#xff0c;数据一致&#xff0c;本地事务发布20…...

new Date()解析

JavaScript 中的 new Date() 构造函数用于创建一个表示日期和时间的对象。Date 对象使得你可以以多种方式获取、设置和格式化日期和时间。让我们深入解析一下 new Date() 及其用法。 创建 Date 对象 可以通过多种方式创建 Date 对象&#xff1a; 不带参数&#xff1a; let no…...

df 的各种用法 以及与du 的区别

df的用法 在 Linux 中&#xff0c;“df”&#xff08;disk free&#xff09;是一个用于显示磁盘空间使用情况的命令。 一、主要功能 它可以列出文件系统的磁盘空间使用情况&#xff0c;包括磁盘总容量、已使用空间、可用空间以及使用率等信息。 二、常见用法及参数 基本用法&a…...

2024年下半年软考准考证什么时候打印?

2024年下半年软考准考证打印入口网址如下&#xff1a; https://bm.ruankao.org.cn/sign/welcome 广东的同学特别注意&#xff1a;准考证打印截止时间是11月8号&#xff0c;也就是考试前一天。一定要提前打印准考证&#xff0c;考试当天是无法打印的。 2024年下半年软考准考证…...

企业安全运行与维护(Enterprise Security Operation and Maintenance)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

每日“亿“题 东方博宜OJ 1424-自然数的分解

原题链接&#xff1a;1424 - 自然数的分解-东方博宜OJ 题目描述 给定自然数 n &#xff0c;将其拆分成若干自然数的和。输出所有解&#xff0c;每组解中数字按从小到大排列。相同数字的不同排列算一组解。 如&#xff0c;读入整数 3 &#xff0c;分解方案如下&#xff1a; …...

初识Linux · 文件(1)

目录 前言&#xff1a; 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言&#xff1a; 本文以及下篇文章&#xff0c;揭露的都是Linux中文件的奥秘&#xff0c;对于文件来说&#xff0c;初学Linux第一节课接触的就是文件&#xff0c;对于C…...