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

【设计模式之原型模式 】– C++

5. 原型模式 – 复制粘贴,一摸一样

简介

原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新的对象,而无需从头开始构建。

使用场景

它通常用于以下情况:

  1. 当一个系统需要独立于其类型的对象时,它可以从已有的对象克隆出新的实例,而不是通过构造函数创建。
  2. 当创建一个对象的过程比复制一个现有对象更昂贵时,原型模式可以提高性能。

原型模式的关键思想是创建一个原型对象,然后根据该原型对象创建新的对象。这个原型对象通常是一个已经存在并配置好的对象,它包含了所需的初始状态和属性。新对象从原型对象复制其状态和属性,以便于快速创建多个相似的对象。

实现方式

在实现原型模式时,通常有两种方式:

  1. 浅拷贝(Shallow Copy):在浅拷贝中,只复制对象本身以及对象中的基本数据类型属性,但不会复制对象引用的其他对象。这意味着新对象和原型对象会共享一些对象引用,如果修改了这些共享引用指向的对象,会影响到原型对象和克隆对象。
  2. 深拷贝(Deep Copy):在深拷贝中,不仅复制对象本身和基本数据类型属性,还会递归复制对象引用的其他对象,以确保新对象和原型对象之间没有共享的引用。
优点和注意事项

原型模式的优点包括:

  • 提高性能:避免了重复创建对象时的昂贵初始化过程。
  • 简化对象创建:可以通过复制现有对象来创建新对象,无需了解对象的构造细节。
  • 支持多态性:克隆操作可以用于创建子类对象。

需要注意的是,原型模式在某些情况下可能会引入复杂性,特别是在对象包含循环引用或大量子对象的情况下。因此,在使用原型模式时需要小心处理这些情况。

总之,原型模式是一种有助于创建对象的设计模式,它通过复制现有对象来创建新对象,提供了一种灵活、高效的方式来管理对象的创建和初始化。

实现

实现深拷贝方式,主要是写一个clone方法

// 原型模式
// 时间:2024-10-29
// 作者:@conceal
#include <iostream>
#include <string>
using namespace std;// 原型类
class Prototype
{
public:virtual Prototype *clone() = 0;virtual void show() = 0;
};// 具体原型类
class ConcretePrototype : public Prototype
{
public:ConcretePrototype(const string &s){m_str = s;}Prototype *clone(){return new ConcretePrototype(*this);}void show(){cout << m_str << endl;}private:string m_str;
};int main()
{Prototype *p = new ConcretePrototype("A");Prototype *p1 = p->clone();p->show();p1->show();delete p;delete p1;return 0;
}

输出

A
A

相关文章:

【设计模式之原型模式 】– C++

5. 原型模式 – 复制粘贴&#xff0c;一摸一样 简介 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是通过复制现有对象来创建新的对象&#xff0c;而无需从头开始构建。 使用场景 它通常用于以下情况&#xff1a; 当一个系统…...

Flask路由机制分析之二

一、前言 上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念&#xff0c;这节我们具体分析一下路由内部机制&#xff0c;Flask路由依赖于werkzegu的routing模块来实现。 二、werkzegu的routing模块介绍 Werkzegu库的routing模块主要功能在于URL…...

vue中如何获取当时时间时分秒

在 Vue 中可以使用 JavaScript 中的 Date 对象来获取当前时间&#xff0c;然后使用 Vue 中的数据绑定将时间显示在页面上。 <template><div><p>当前时间&#xff1a;{{ time }}</p></div> </template><script> export default {dat…...

matlab simulink 直线一级倒立摆控制(自起摆和稳态控制)

1、内容简介 略 6-可以交流、咨询、答疑 2、内容说明 控制器设计 自起摆建模 规定正方向&#xff1a;顺时针为角度&#xff08;力矩&#xff09;正方向&#xff0c;向右为位移正方向。 在规定的正方向条件下&#xff0c;图 1 所示摆杆的角度φ为正值&#xff0c; 下车向右加…...

Transformers实战(二)快速入门文本相似度、检索式对话机器人

Transformers实战&#xff08;二&#xff09;快速入门文本相似度、检索式对话机器人 1、文本相似度 1.1 文本相似度简介 文本匹配是一个较为宽泛的概念&#xff0c;基本上只要涉及到两段文本之间关系的&#xff0c;都可以被看作是一种文本匹配的任务&#xff0c; 只是在具体…...

【错误解决方案】ModuleNotFoundError: No module named ‘PeptideBuilder‘

1. 错误提示 在python程序中&#xff0c;试图导入一个不存在的模块PeptideBuilder导致的错误&#xff1a; 错误提示&#xff1a;ModuleNotFoundError: No module named PeptideBuilder 2. 解决方案 解决方案是确保你已经正确安装了PeptideBuilder模块。你可以通过pip来安装它…...

汇编学习(1)

汇编、CPU架构、指令集、硬编码之间的关系 ● 汇编语言&#xff1a;这是一种低级语言&#xff0c;用于与硬件直接交互。它是由人类可读的机器码或指令组成的&#xff0c;这些指令告诉CPU如何执行特定的任务。每条汇编指令都有一个对应的机器码指令&#xff0c;CPU可以理解和执…...

C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmlinkernel : Svmgenkernel { public int n { get; set; } public double[] mu { get; set; } public Svmlinkernel(double[,] ddata, double[] yy) : base(yy, ddata) …...

【鸿蒙软件开发】ArkTS容器组件之Badge

文章目录 前言一、Badge组件1.1 子组件1.2 接口接口1参数 接口2参数 BadgePosition枚举说明BadgeStyle对象说明 1.3 示例代码 总结 前言 Badge组件&#xff1a;可以附加在单个组件上用于信息标记的容器组件。 一、Badge组件 可以附加在单个组件上用于信息标记的容器组件。 说…...

H5游戏源码分享-命悬一线

H5游戏源码分享-命悬一线 在合适的时机跳下绳子&#xff0c;能安全站到木桩上&#xff0c;就通过。 游戏源码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name&…...

【电路笔记】-交流电阻和阻抗

交流电阻和阻抗 文章目录 交流电阻和阻抗1、概述&#xff1a;电阻率2、交流状态与直流状态近似性3、交流状态与直流状态的差异性3.1 趋肤效应(The Skin Effect)3.2 靠近效应&#xff08;The Proximity Effect&#xff09; 4、总结 电阻是一种特性&#xff0c;用于表征当电压差施…...

android开发使用OkHttp自带的WebSocket实现IM功能

一、背景 android app开发经常会有IM需求&#xff0c;很多新手不晓得如何入手&#xff0c;难点在于通讯不中断。其实android发展到今天&#xff0c;很多技术都很完善&#xff0c;有很多类似框架可以实现。例如有&#xff1a;okhttp自带的websocket框架、easysocket等等。本文主…...

前端小技巧: TS实现柯里化函数

实现 curry 函数&#xff0c;把其他函数柯里化 curry 返回一个函数fn执行fn, 中间状态返回函数&#xff0c;如 add(1), 或者 add(1)(2)最后返回执行结果&#xff0c;如 add(1)(2)(3) function curry(fn:Function) {const fnArgsLen fn.length // 传入函数的参数长度let args…...

【算法-数组2】有序数组的平方 和 长度最小的子数组

今天&#xff0c;带来数组相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输…...

H5游戏源码分享-接苹果游戏拼手速

H5游戏源码分享-接苹果游戏拼手速 看看在20秒内能接多少个苹果 <html> <head><title>我是你的小苹果</title><meta charset"utf-8"/><meta name"viewport" content"initial-scale1, user-scalableno, minimum-scale…...

详解类生到死的来龙去脉

类生命周期和加载过程 一个类在 JVM 里的生命周期有 7 个阶段&#xff0c;分别是加载&#xff08;Loading&#xff09;、校验&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解析&#xff08;Resolution&#xff09;、初始化&#xff08;Ini…...

寻找倒数第K个节点

这篇文章也是凑数的 ... 寻找倒数第K个节点 描述 : 找出单向链表中倒数第 k 个节点。返回该节点的值。 题目 : LeetCode 返回倒数第K个节点 : 面试题 02.02. 返回倒数第 k 个节点 说明 : 给定的 k 保证是有效的。 分析 : 我们给出个例子 : 首先&#xff0c;我们创建两个…...

[ROS系列]ubuntu 20.04 从零配置orbslam3(无坑版)

目录 背景: 结果展示: 一、配置虚拟机 二、 同步网络时间 三、ping网络 四、 安装ros 五、下载源码 六、下载orb_slam3 error1:Pangolin error2: ./HelloPangolin: error while loading shared libraries: libpango_windowing.so: cannot open shared object file…...

网络协议--TCP的保活定时器

23.1 引言 许多TCP/IP的初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接。也就是说&#xff0c;如果TCP连接的双方都没有向对方发送数据&#xff0c;则在两个TCP模块之间不交换任何信息。例如&#xff0c;没有可以在其他网络协议中发现的轮询。这意味着我们可以…...

leetcode 1353. 最多可以参加的会议数目

给你一个数组 events&#xff0c;其中 events[i] [startDayi, endDayi] &#xff0c;表示会议 i 开始于 startDayi &#xff0c;结束于 endDayi 。 你可以在满足 startDayi < d < endDayi 中的任意一天 d 参加会议 i 。注意&#xff0c;一天只能参加一个会议。 请你返回…...

为内部工具配置Taotoken作为统一AI能力后端

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为内部工具配置Taotoken作为统一AI能力后端 在团队开发多个内部工具&#xff08;如客服问答辅助、代码生成器或文档分析助手&#…...

终极HTTP请求控制指南:如何用HeaderEditor轻松掌握浏览器网络调试

终极HTTP请求控制指南&#xff1a;如何用HeaderEditor轻松掌握浏览器网络调试 【免费下载链接】HeaderEditor Manage browsers requests, include modify the request headers, response headers, response body, redirect requests, cancel requests 项目地址: https://gitc…...

在GitHub项目中集成Taotoken多模型API的完整配置指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在GitHub项目中集成Taotoken多模型API的完整配置指南 将大模型能力集成到GitHub托管的项目中&#xff0c;是现代开发工作流的常见需…...

SAP ABAP开发:别再只会用POPUP_TO_CONFIRM了,这5个实用弹出框函数帮你搞定90%交互场景

SAP ABAP开发&#xff1a;解锁5个被低估的弹出框函数&#xff0c;告别单调交互设计 在SAP ABAP开发中&#xff0c;弹出框是用户交互的重要桥梁。许多开发者习惯性地依赖POPUP_TO_CONFIRM&#xff0c;却忽略了SAP标准库中那些功能更强大、场景更匹配的交互方案。本文将带你深入探…...

深入剖析VSCODE在Ubuntu虚拟机中遭遇EACCES权限错误的根源与安全修复方案

1. 当VSCODE在Ubuntu虚拟机中突然罢工&#xff1a;EACCES权限错误的真实面目 第一次在Ubuntu虚拟机里用VSCODE修改文件时&#xff0c;突然跳出的"EACCES: permission denied"警告框&#xff0c;相信让不少开发者心头一紧。这个看似简单的权限错误&#xff0c;背后其…...

3步掌握WeChatExporter:免费开源的微信数据备份解决方案

3步掌握WeChatExporter&#xff1a;免费开源的微信数据备份解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 微信聊天记录中蕴含着无数珍贵的工作沟通、个人回忆和…...

亚马逊会再推智能手机吗?负责人回应含糊,Transformer 项目充满悬念

亚马逊智能手机计划&#xff1a;是与否的模糊回应亚马逊设备与服务部门负责人帕诺斯帕奈在面对是否推出智能手机的问题时&#xff0c;给出了模棱两可的回答。他表示这并非公司目标&#xff0c;但又不直接否认可能性。此前有报道称亚马逊正在开发代号为“Transformer”、搭载 Al…...

开源远程开发者职位目录:架构设计与社区驱动实践

1. 项目概述&#xff1a;一份远程开发者工作目录的诞生与价值 如果你是一名开发者&#xff0c;并且正在寻找一份可以摆脱地理限制、拥抱灵活工作方式的远程职位&#xff0c;那么你很可能已经体会过在各大招聘网站、社交媒体和零散论坛中“大海捞针”的痛苦。信息分散、质量参差…...

AI编程助手技能化:开源agent-skills项目实战指南

1. 项目概述&#xff1a;为AI编程助手注入“专业技能包” 如果你和我一样&#xff0c;日常重度依赖 Claude Code、Cursor 这类 AI 编程助手来辅助开发和研究&#xff0c;那你肯定遇到过这样的场景&#xff1a;想让 AI 帮你深入理解一篇复杂的数学论文&#xff0c;或者验证一个…...

Windows Defender彻底移除工具:2025终极完整使用教程

Windows Defender彻底移除工具&#xff1a;2025终极完整使用教程 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/wi/w…...