重温设计模式--原型模式
文章目录
- 原型模式定义
- 原型模式UML图
- 优点
- 缺点
- 使用场景
- C++ 代码示例
- 深拷贝、浅拷贝
原型模式定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
核心中的核心就是 克隆clone ,后面讲
原型模式是一种创建型设计模式,它的主要意图是通过复制现有的对象实例来创建新的对象,而不是通过传统的使用构造函数来初始化创建。
原型模式UML图

优点
提高创建对象的效率:当创建一个对象的过程比较复杂,例如需要进行大量的初始化操作、读取配置文件等,如果采用传统的构造方式每次创建都要重复这些复杂过程,而原型模式通过复制已有对象,能快速创建新对象,节省时间和资源。
便于动态创建对象:可以在运行时根据已有对象动态生成新的对象,对于一些需要根据不同场景灵活生成相似对象的情况非常有用。
缺点
深拷贝和浅拷贝问题:在实现对象复制时,如果对象中包含指针等复杂成员,需要正确处理深拷贝和浅拷贝的情况,否则可能导致数据不一致等问题。比如浅拷贝只是简单复制指针,多个对象会指向同一块内存区域,修改一个对象的数据可能意外影响到其他对象。
每一个类都要配备克隆方法:要使用原型模式,需要在具体的类中实现克隆(复制)的相关方法,增加了代码编写和维护的工作量。
使用场景
对象创建成本高的情况:比如创建一个数据库连接对象,初始化过程涉及到加载驱动、配置参数、建立网络连接等复杂操作,后续需要多个相似的连接对象时,就可以用原型模式复制已有的连接对象来快速创建新的。
根据已有对象生成变体对象:例如在图形绘制系统中,已经绘制了一个圆形,要基于这个圆形生成几个大小、颜色等属性稍有不同的新圆形,通过原型模式复制已有圆形对象再进行属性修改就很方便。
C++ 代码示例
以下是一个简单的 C++ 代码示例来演示原型模式,这里假设有一个简单的 Shape(图形)类作为基类,有 Rectangle(矩形)类继承自它,通过原型模式来复制矩形对象:
#include <iostream>
#include <string>// 抽象基类,定义克隆接口
class Shape
{
public:virtual Shape* clone() = 0;virtual void draw() = 0;virtual ~Shape() {}
};// 具体的矩形类
class Rectangle : public Shape
{
private:int width;int height;
public:Rectangle(int w, int h) : width(w), height(h) {}// 实现克隆方法,返回一个新的矩形对象副本Shape* clone() override {return new Rectangle(*this);}void draw() override{std::cout << "Drawing a rectangle with width: " << width << " and height: " << height << std::endl;}
};int main()
{Rectangle originalRect(10, 20);originalRect.draw();// 通过原型模式复制矩形对象Shape* clonedRect = originalRect.clone();clonedRect->draw();delete clonedRect;char t;std::cin>>t;return 0;
}

在上述代码中:
首先定义了抽象基类 Shape,它有一个纯虚函数 clone 用于克隆对象,还有一个纯虚函数 draw 用于绘制图形(这里只是简单输出图形相关信息示意)。
Rectangle 类继承自 Shape,它有自己的成员变量 width 和 height 表示矩形的宽和高,其构造函数用于初始化这两个属性。关键的是实现的 clone 函数,通过 new Rectangle(this) 利用拷贝构造函数创建了一个新的 Rectangle 对象,这个新对象就是原对象的副本,然后返回这个副本的指针(以 Shape 类型返回,体现了多态性)。
在 main 函数中,先创建了一个原始的矩形对象 originalRect 并调用 draw 展示其信息,然后通过原型模式调用 clone 方法复制出一个新的矩形对象 clonedRect,同样调用 draw 展示,最后记得释放动态分配的内存(通过 delete 操作符),避免内存泄漏。
实际应用中,如果类的成员变量有指针等情况,可能还需要更细致地处理拷贝构造函数来确保深拷贝正确执行,避免出现意外的数据共享和修改问题。
深拷贝、浅拷贝
浅拷贝仅复制对象的引用(指针),而深拷贝会创建一个新对象,并复制对象的内容。
同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝.
一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。
class MyClass {
public:int* data;MyClass(int value) {data = new int(value);}// 浅拷贝构造函数MyClass(const MyClass& other) {data = other.data; // 浅拷贝,指针复制}// 析构函数~MyClass() {delete data;}
};class MyClass {
public:int* data;MyClass(int value) {data = new int(value);}// 深拷贝构造函数MyClass(const MyClass& other) {data = new int(*(other.data)); // 深拷贝,复制对象内容}// 赋值运算符,进行深拷贝MyClass& operator=(const MyClass& other) {if (this != &other) {delete data;data = new int(*(other.data)); // 深拷贝}return *this;}// 析构函数~MyClass() {delete data;}
};
相关文章:
重温设计模式--原型模式
文章目录 原型模式定义原型模式UML图优点缺点使用场景C 代码示例深拷贝、浅拷贝 原型模式定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象; 核心中的核心就是 克隆clone ,后面讲 原型模式是一种创建型设计模式,它的主要…...
输变电资质分一级、二级,新办从二级开始,三级已取消
输变电工程专业承包资质分为一级.二级.三级。 一、输变电工程专业承包一级资质标准:1、企业资产净资产5000万元以上。2、企业主要人员(1)机电工程专业一级注册建设师不少于10人。(2)技术负责人…...
浏览器http缓存问题
一、什么是浏览器缓存 浏览器将请求过的资源(html、js、css、img)等,根据缓存机制,拷贝一份副本存储在浏览器的内存或者磁盘上。如果下一次请求的url相同时则根据缓存机制决定是读取内存或者磁盘上的数据还是去服务器请求资源文件…...
结构化Prompt:让大模型更智能的秘诀
一、结构化提示词 1. 什么是结构化? 结构化: 对信息进行组织,使其遵循特定的模式和规则,从而方便有效理解信息。结构化的思想在各类文本中都得到了广泛应用,例如文章、书籍中都使用了标题、子标题、段落等语法结构。结构化 Prompt 的思维方…...
威联通NAS部署openwrt软路由保姆级教程附镜像文件
创作立场:原创不易,拒绝搬运~ hello 大家好,我是你们的老伙伴,稳重的大王~ 本期教程为大家分享,怎么在NAS里面部署软路由,下面是软路由的镜像文件,有两个版本,400M的是定制版~ Sh…...
《计算机网络(第7版)-谢希仁》期末考试复习题和答案(总结整理)
目录 前言: 一、选择题。 二、填空题。 三、名词解释。 四、简答题。 前言: 这个自动标题自己带了序号,一开始想全部选项和题号都改过来的,结果一看一百多个全是,懒得改了 一、选择题。 1、广域网覆盖的地理范围…...
windows和mac共享文件夹访问教程
mac共享文件夹,windows访问: mac上开启文件夹共享,并添加文件夹和用户,然后windows 上 在windows上快捷键 win r 打开运行,按如下格式输入mac设备的IP地址: 就可以访问了: windows共享文件夹…...
【PPTist】网格线、对齐线、标尺
前言:本篇文章介绍辅助我们摆放元素位置的几个功能 一、网格线功能 网格线主要是用来辅助我们对齐元素的,右键可以选择使用哪种网格线,以及关闭和打开 显示效果就是图中的这种效果。但是强迫症有点难受,它底部没对齐啊啊啊 不…...
Leetcode3218. 切蛋糕的最小总开销 I
题目描述: 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和两个数组: horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。verticalCut 的大小为 n - 1 …...
ECCV-2024 | 指令不够用、大模型来生成!BEVInstructor:基于BEV感知和大模型的视觉语言导航指令生成
作者:Sheng Fan, Rui Liu, Wenguan Wang, and Yi Yang 单位:浙江大学 原文链接:Navigation Instruction Generation with BEV Perception and Large Language Models (https://link.springer.com/chapter/10.1007/978-3-031-726…...
【UE5.3.2 】引擎中安装RiderLink插件
Rider会提示你安装这个插件选择在引擎中安装 Running AutomationTool... Using bundled DotNet SDK version: 6.0.302 Starting AutomationTool... Parsing command line: BuildPlugin -Unversioned -Plugin=C:\Users\zhangbin\AppData\Local\...
【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)
一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod , CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高,缺省时使用组件自身内容的宽高,比如充满父布…...
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考,可为它支持数万台支持标准的网…...
4.银河麒麟V10(ARM) 离线安装 MySQL
1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…...
Redis四种模式在Spring Boot框架下的配置
1. 单机模式 application.properties 配置: spring.redis.host127.0.0.1 spring.redis.port6379 spring.redis.passwordyourpasswordspring.redis.host: 该配置指定 Redis 服务器的主机地址。在单机模式下,通常是本地 Redis 实例(127.0.0.1…...
Golang的性能监控指标
Golang的性能监控指标 一、介绍 是一种高性能的编程语言,因其并发模型和内建的性能监控工具而备受开发者青睐。在实际开发中,我们需要了解一些重要的性能监控指标,以便及时发现和解决性能问题。本文将介绍Golang中常用的性能监控指标…...
基于GAN和DenseNett组合的调制信号分类网络(源码)
(需要源码请私信或评论) 生成对抗网络(GAN)原理 生成对抗网络(GAN)是一种革命性的深度学习模型,在无监督学习领域取得了显著进展。其核心思想基于 二人零和博弈 ,通过生成模型和判别模型的相互竞争实现高质量的数据合成。GAN由Ian Goodfellow等人于2014年首次提出,随后在图…...
uniapp 项目基础搭建(vue2)
一 .创建项目 创建项目可以通过工具创建,也可以通过脚手架下载 1.通过工具创建 2.通过脚手架下载 安装脚手架 npm install -g vue/cli 下载项目模板 vue create -p dcloudio/uni-preset-vue 项目名称 二. 下载相关依赖 1. 项目默认是没有package.json文件的&…...
中关村科金外呼机器人智能沟通破解营销难题
当今,传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性,难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员,成为企业的难题。中关村科金外呼机器人通过智能化沟通技术,为企业提供了一站…...
【Linux】处理用户输入
一、基本介绍 1、如何传递参数 向shell脚本传递数据的最基本方法就是通过命令行参数。如下,这条命令会向test.sh脚本传递10和20这两个参数。 ./test.sh 10 20 2、如何读取参数 bash shell会将所有的命令行参数都指派给称作位置参数(positional parame…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
