原型模式

news2025/4/20 7:40:55

开始原型模式前,我们要知道深拷贝的定义,因为原型模式中的克隆操作核心就是深拷贝。

深拷贝和浅拷贝

下图为浅拷贝(即是编译器的默认版本), 只拷贝了指针, 两个指针同时指向一个内存, 会有危险(a改变时b也改变, 称为别名) , 导致内存泄漏

调用strcpy复制,自动复制结尾的'\0'

下图为深拷贝, 添加了动态分配内存和拷贝内容进新创建的内存

C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数

两个的区别?

        ①在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的;但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象,所以,此时,必须采用深拷贝。

        ②深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。简而言之,当数据成员中有指针时,必须要用深拷贝。

-动机

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。

如何应对这种变化? 如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序"”不随着需求改变而改变?

-模式定义

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

-结构/类图

-要点总结

原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。

原型模式对于“如何创建易变类的实体对象"采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口"的新对象——所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方Clone。

原型模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝。

工厂模式和原型模式的区别:

        ①性能区别:如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象 ,以达到节省创建时间的目的。

        实际上,创建对象包含的申请内存、给成员变量赋值这一过程,本身并不会花费太多时间,或者说对于大部分业务系统来说,这点时间完全是可以忽略的。应用一个复杂的模式,只得到一点点的性能提升,这就是所谓的过度设计,得不偿失。

        但是,如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取 ,这种情况下,我们就可以利用原型模式,从其他已有对象中直接拷贝得到,而不用每次在创建新对象的时候,都重复执行这些耗时的操作。
        ②使用场景区别:原型模式更侧重用在同种对象(正常/感冒/发烧的人),保留对象的中间态,在需要某种状态的对象(感冒的人)的时候对它进行克隆;工厂模式侧重分类各种对象(正常的人/猫/狗),在需要猫时,调用猫工厂创建猫。

代码如下:

 结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt扫盲-QTreeWidget理论总结

QTreeWidget理论总结1. 简述2. QTreeWidgetItem 简述3. 头标签4. 常用功能5. 槽函数6. 信号1. 简述 QTreeWidget 类是Qt提供了一个标准的树部件,该部件具有经典的基于 Item 的界面,每个Item都是一个 QTreeWidgetItem。这个标准的树控件不需要model/view…

文科女进德国IBM实习做程序媛,我是怎么办到的?

很快我在IBM德国区实习的第一个月就要结束了。 作为一个土生土长的文科生(硕士语言学、本科语言学商科),现在竟在欧洲混入跨国科技公司做编程技术类实习生,我自己也挺意外的。 尽管只是一点点微不足道的个人经历,此时…

教你如何优雅的转行Python程序员,一学就会

在实际的工作中,我们经常发现,很多朋友在某一个工作中做了一段时间,发现自己越做越没兴趣,越做越不开心,想跳不敢跳,想辞不敢辞,最后影响了自己的本职工作,陷入两难的窘境。 其实&am…

【Qbot】3.加入内容审核功能

该项目计划长期进行维护更新,欢迎star:https://github.com/zstar1003/Qbot 前言 在ChatGPT上线Q群不久,不少人对其进行了测试,但随着时间的延续,测试话题逐渐走向失控,迫使我不得不紧急暂停。 对同胞素质的…

【Python百日进阶-数据分析】Day134 - plotly饼图:go.pie()实例

文章目录4.2 go.Pie() 的基本饼图4.2.1 基本饼图4.2.2 样式饼图4.2.3 使用 uniformtext 控制文本字体大小4.2.4 控制饼图中的文本方向4.2.5 甜甜圈图4.2.6 从中心拉出扇区4.2.7 子图中的饼图4.2.8 自定义颜色集的子图4.2.9 绘制面积与总计数成比例的图表4.2.10 旭日图4.2.11 Da…

电脑软件、微信多开

因为办公需要在电脑上登录 2 个微信,但是直接双击微信图标只有 1 个登录界面,无法是现实登录 2 个微信。那么怎么才能在 1 个电脑上打开 2 个微信,方法有四种:1、安装;2、Enter;3、连续点击;4、…

『 canvas 特效』一文教你绘制绚丽的星空背景 TS + ES6

介绍 很久没有写关于 canvas 效果的文章了,刚好最近又学到了一个新的特效,使用 canvas 绘制多层次动态星空背景,今天就分享给大家。首先我们依旧来看一下最终实现的效果,如图所示: 由于录制 GIF 造成失帧,…

实战三十三:STAMP算法实现商品推荐实战 代码+数据

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。STAMP推荐…

记录Win7系统下的node版本升级过程及后续项目启动所遇问题

目录 Windows7系统如何“安装”高版本Node 后续项目运行启动时遇到的问题 Bug : 背景 : 银行内网开发,接到一个新的项目开发,但前提因为开发所使用的云桌面更换了,由原来的Windows10系统降到了现在的Windows7系统&am…

【自媒体必备】AI文字转语音,支持多种人声选择,在线生成一键导出【电脑永久版】

AI文字转语音,支持多种人声选择,在线生成一键导出 软件是电脑版安装版本,大家根据自己安软件的习惯进行安装即可,安装后打开软件即可,且完全免费。语音选择方面就有晓晓、云扬、云希等等常用选择。点击后面的播放按钮…

腾讯大佬告诉你,写Python到底用什么IDE合适

不管你是 Python 新手还是老鸟,肯定纠结过一个问题: 到底用什么编辑器写 Python 代码好? 为此,我们调查了数十位鹅厂程序猿们爱用的 Python IDE,从他们对每款编辑器的看法中,也许能给你一点启示&#xff1…

我对程序员做副业有这几点建议

疫情这几年,“副业”的概念非常火。各大平台上都在说“副业赚钱”、“副业是刚需”等相关的内容、视频,有免费的,还有付费观看的。 其实在2020年疫情之前,大家对于“副业”并没有很关心。 从百度指数上可以明显看出,…

【笔记】Pade Approximations

1 pade approximations是什么? Pad Approximations是一种对pure delay使用常规传函进行近似替换的方法,matlab提供了的一个库函数pade。 在传递函数中,用e−τse^{-\tau s}e−τs表示纯延时pure delay环节,它对信号的幅值不会有任…

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.2 Nacos的服务注册表结构是怎样的? 54.2.1 多级存储模型

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.2 Nacos的服务注册表结构是怎样的?54.2.1 多级存储模型54 微服务篇…

《Redis实战篇》四、分布式锁

文章目录4.1 基本原理和实现方式对比4.2 Redis分布式锁的实现核心思路4.3 实现分布式锁版本一4.4 Redis分布式锁误删情况说明4.5 解决Redis分布式锁误删问题4.6 分布式锁的原子性问题4.7 Lua脚本解决多条命令原子性问题4.8 利用Java代码调用Lua脚本改造分布式锁4.1 基本原理和实…

Oracle时间函数

Oracle 时间函数INTERVAL间隔一年间隔一天间隔一小时间隔一分钟NUMTODSINTERVAL间隔一天间隔一小时间隔一分钟MyBatis xml 中计算时间间隔需要处理的问题INTERVAL 函数整合到 MyBatis$ 符号拼接 sql 源码追踪NUMTODSINTERVAL 函数整合到 MyBatisOracle 时间间隔函数有INTERVAL、…

%25 express 中的中间件

1、express 中的中间件 (1)、当客户端的请求到达 express 服务器后,会连续调用多个中间件,对请求进行预处理 (2)、本质是一个 function 处理函数(与普通路由函数相比,形参中多了 next 参数&…

深入分析广告和电商结合的逻辑,针对性推出一套广告电商方案

大家好,我是林工,本期林工给大家深入分析广告和电商结合的逻辑,针对性推出一套广告电商方案。 对于消费者来说,广告要发挥引导、刺激并满足消费者需求的作用,首先要使广告传播的信息引人注意,激发消费者购…

掌握Qt构造系统

1. 前言 ​对于日常在Qt或者Visual Studio等**集成开发环境(即IDE)**中编码的开发者来说,构造系统通常是比较容易被忽略的部分。集成开发环境配置简单,界面友好,可以提高开发效率。 ​随着对开发环境的深度使用&…

2.0、Hibernate-级联关系

2.0、Hibernate-级联关系 级联关系 中 最为常见的就是 -> 1、一对多关系 :一个消费者可以购买多个商品 -> 生成多个订单; 消费者是1,订单是多 那么在数据库中,1 的一方是主表,多的一方是从表,通过主外键关系去维…