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

篇五:原型模式:复制对象的秘密

篇五:"原型模式:复制对象的秘密"

设计模式是软件开发中的重要组成部分,原型模式是创建型设计模式中的一种。原型模式旨在通过复制现有对象来创建新的对象,而不是通过调用构造函数来创建。在C++中,原型模式广泛应用于需要复制对象的场景,让我们一起深入探讨其作用和实现方式,并通过示例代码演示在C++中如何使用原型模式来克隆对象。

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

1. 原型模式的作用和实现方式:
原型模式是创建型设计模式,其作用在于通过复制现有对象来创建新的对象,而无需调用构造函数。原型模式使用了原型实例作为创建对象的原型,并通过复制该原型来创建新的对象,从而避免了对象创建时的复杂和耗时操作。

原型模式的实现方式如下:

  1. 定义一个抽象原型类,包含一个克隆方法。
  2. 创建具体原型类,继承抽象原型类,并实现克隆方法,用于复制对象。
  3. 在客户端代码中,通过调用克隆方法来复制对象,而不是通过调用构造函数。

2. 在C++中使用原型模式克隆对象的示例代码:
在C++中,我们将以复制图形对象为例来展示原型模式的应用。

a. 定义抽象原型类:

// Shape.h
#include <iostream>class Shape {
public:virtual ~Shape() {}virtual Shape* clone() const = 0;virtual void draw() const = 0;
};

b. 创建具体原型类:

// Circle.h
#include "Shape.h"class Circle : public Shape {
public:Circle(int radius) : radius_(radius) {}Shape* clone() const override {return new Circle(*this);}void draw() const override {std::cout << "Drawing a circle with radius " << radius_ << std::endl;}private:int radius_;
};// Square.h
#include "Shape.h"class Square : public Shape {
public:Square(int sideLength) : sideLength_(sideLength) {}Shape* clone() const override {return new Square(*this);}void draw() const override {std::cout << "Drawing a square with side length " << sideLength_ << std::endl;}private:int sideLength_;
};

c. 使用原型模式克隆对象:

// main.cpp
#include "Circle.h"
#include "Square.h"int main() {Shape* circlePrototype = new Circle(5);Shape* squarePrototype = new Square(4);// 使用原型模式克隆对象Shape* clonedCircle = circlePrototype->clone();Shape* clonedSquare = squarePrototype->clone();// 绘制克隆的图形clonedCircle->draw();clonedSquare->draw();// 释放资源delete circlePrototype;delete squarePrototype;delete clonedCircle;delete clonedSquare;return 0;
}

在上述示例中,我们定义了抽象原型类Shape,并创建了具体原型类CircleSquare。其中,CircleSquare类分别表示圆形和正方形,并实现了抽象原型类的克隆方法来复制对象。

在客户端代码中,我们首先创建原型对象circlePrototypesquarePrototype,然后通过调用克隆方法clone()来复制对象,得到clonedCircleclonedSquare,最后通过调用draw()方法来绘制克隆的图形。

3. 原型模式的代码解析:

  • 原型模式通过复制现有对象来创建新的对象,避免了对象创建时的复杂和耗时操作,提高了对象创建的效率。
  • 抽象原型类定义了克隆方法,具体原型类实现了克隆方法,用于复制对象。
  • 客户端代码通过调用克隆方法来复制对象,而不是通过调用构造函数。

4. 总结:
原型模式是创建型设计模式,其作用在于通过复制现有对象来创建新的对象,从而避免了对象创建时的复杂和耗时操作。在C++中,通过定义抽象原型类和具体原型类,以及在客户端代码中使用原型对象的克隆方法,实现了原型模式的应用。

希望本文能够帮助您更好地理解原型模式的原理和在C++中的应用。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
  • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

相关文章:

篇五:原型模式:复制对象的秘密

篇五&#xff1a;"原型模式&#xff1a;复制对象的秘密" 设计模式是软件开发中的重要组成部分&#xff0c;原型模式是创建型设计模式中的一种。原型模式旨在通过复制现有对象来创建新的对象&#xff0c;而不是通过调用构造函数来创建。在C中&#xff0c;原型模式广泛…...

为什么ip地址一直在变化

IP地址是计算机网络中用于唯一标识一台设备的二进制数字串。在互联网中&#xff0c;每台计算机都需要一个唯一的IP地址&#xff0c;以便与其他计算机进行通信。然而&#xff0c;有些情况下&#xff0c;IP地址可能会发生变化。 有多种原因可能导致IP地址发生变化。下面虎观代理…...

10.物联网操作系统之低功耗管理

一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为&#xff1a; 1.备份域&#xff1a;备份电源&#xff0c;仔细在stm32的板子上寻找&#xff0c;大多都有纽扣电池。 注意&#xff1a;参考手册&#xff08;PWR&#xff09;章节有详细的介绍。 2.…...

SQL SERVER 2019 数据库还原测试库的方法

1、备份正式库数据 2、在其它电脑上还原备份的数据库 不需要覆盖其它数据库&#xff0c;直接还原出数据库 还原时修改文件名和数据库名称&#xff1a; 修改文件名称 还原成功...

leetcode 62. 不同路径

2023.8.8 用dp算法一遍过了&#xff0c;很舒服。 重点还是要确定dp数组的含义&#xff0c;本题的dp数组要设成二维的&#xff0c;dp[i][j]的含义是&#xff1a;到&#xff08;i&#xff0c;j&#xff09;这个点一共有多少种路径。由于题中说了m和n都大于1&#xff0c;所以假设一…...

ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)

文章目录 1.常见的芯片类型2.数字隔离芯片有什么用&#xff1f;3.I2C的I/O扩展芯片说明4.16位I/O扩展芯片TCAL6416的features、applications、description5.TCAL6416的引脚功能6.TCAL6416的电气特性7.TCAL6416的典型特性&#xff08;图像&#xff09;8.TCAL6416的参数测量信息&…...

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…...

K最近邻算法:简单高效的分类和回归方法(三)

文章目录 &#x1f340;引言&#x1f340;训练集和测试集&#x1f340;sklearn中封装好的train_test_split&#x1f340;超参数 &#x1f340;引言 本节以KNN算法为主&#xff0c;简单介绍一下训练集和测试集、超参数 &#x1f340;训练集和测试集 训练集和测试集是机器学习和深…...

【数据分析专栏之Python篇】五、pandas数据结构之Series

前言 大家好&#xff01;本期跟大家分享的知识是 Pandas 数据结构—Series。 一、Series的创建 Series 是一种类似于一维数组的对象&#xff0c;由下面两部分组成&#xff1a; values&#xff1a;一组数据&#xff0c;ndarray 类型index&#xff1a;数据索引 顾名思义&…...

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面&#xff0c;挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用&#xff0c;需要在里面支持多个版本的中间件客户端&#xff1b;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT&#xff0c;百度&#xff0c;googl…...

对 async/await 的理解

async/await 的理解 async/await 其实是 Generator 的语法糖&#xff0c;它能实现的效果都能用then 链来实现&#xff0c;它是为优化 then 链而开发出来的。从字面上来看&#xff0c;async 是“异步”的简写&#xff0c;await 则为等待&#xff0c;所以很好理解async用于申明一…...

Vue 整合 Element UI 、路由嵌套、参数传递、重定向、404和路由钩子(五)

一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式&#xff0c;创建一个名为 hello-vue 的工程&#xff0c;命令为&#xff1a; # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化&#xff0c;记得一路的 no vue init webpack hello-vue 1.2 安装…...

修改 Ubuntu 系统的时区

修改 Ubuntu 系统的时区 如果 Ubuntu 系统的时区设置不正确&#xff0c;您可以按照以下步骤进行调整&#xff1a; 1. 查看当前的时区设置&#xff0c;可以使用以下命令&#xff1a; timedatectl 这将显示当前系统的日期、时间和时区信息。 2. 如果时区设置不正…...

如何离线安装ModHeader - Modify HTTP headers Chrome插件?

如何离线安装ModHeader - Modify HTTP headers Chrome插件&#xff1f; 1.1 前言1.2 打开Chrome浏览器的开发者模式1.3 下载并解压打包好的插件1.4 解压下载好的压缩包1.5 加载插件1.6 如何使用插件? 1.1 前言 ModHeader 是一个非常好用的Chrome浏览器插件&#xff0c;可以用…...

在Linux中安装MySQL

在Linux中安装MySQL 检测当前系统中是否安装MySQL数据库 命令作用rpm -qa查询当前系统中安装的所有软件rpm -qa|grep mysql查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb查询当前系统中安装的名称带mariadb的软件 RPM ( Red-Hat Package Manager )RPM软件包管理…...

python --windows获取启动文件夹路径/获取当前用户名/添加自启动文件

如何使用Python获取计算机用户名 一、Python自带的getpass模块可以用于获取用户输入的密码&#xff0c;但是它同样可以用来获取计算机用户名。 import getpassuser getpass.getuser() print("计算机用户名为&#xff1a;", user)二、使用os模块获取用户名 Python的…...

微信云托管(本地调试)⑥:nginx、vue刷新404问题

一、nginx默认路径 1.1、默认配置文件路径&#xff1a;/etc/nginx/nginx.conf 1.2、默认资源路径&#xff1a;/usr/share/nginx/html/index.html 二、修改nginx.conf配置 &#xff08;注意配置中的&#xff1a;include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…...

数据结构 二叉树(一篇基本掌握)

绪论 雄关漫道真如铁&#xff0c;而今迈步从头越。 本章将开始学习二叉树&#xff08;全文共一万两千字&#xff09;&#xff0c;二叉树相较于前面的数据结构来说难度会有许多的攀升&#xff0c;但只要跟着本篇博客深入的学习也可以基本的掌握基础二叉树。 话不多说安全带系好&…...

​可视化绘图技巧100篇高级篇(四)-南丁格尔玫瑰图(二)

目录 前言 适用场景 不适用场景 ​堆积式南丁格尔玫瑰图( Nightingale Rose Diagram)...

Stable Diffusion - Candy Land (糖果世界) LoRA 提示词配置与效果展示

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132145248 糖果世界 (Candy Land) 是一个充满甜蜜和奇幻的地方&#xff0c;由各种各样的糖果和巧克力构成。在糖果世界&#xff0c;可以看到&…...

ES6学习-module语法

Module语法 CommonJS模块 let { readfile } require(fs) # 等同于 let _fs require(fs) let readfile _fs.readfile //这种加载称为“运行时加载”ES6模块 import { stat, exists, readFile } from fs;这种加载称为“编译时加载”或者静态加载 静态加载带来的各种好处 …...

Flutter 实现按位置大小比例布局的控件

文章目录 前言一、如何实现&#xff1f;1、数值转成分数2、RowFlexible布局横向3、ColumnFlexible布局纵向 二、完整代码三、使用示例1、基本用法2、四分屏3、六分屏4、八分屏5、九分屏6、414分屏 总结 前言 做视频监控项目时需要需要展示多分屏&#xff0c;比如2x2、3x3、414…...

ES6 - 对象新增的一些常用方法

文章目录 1&#xff0c;Object.is()2&#xff0c;Object.asign()3&#xff0c;Object.getOwnPropertyDescriptors()4&#xff0c;Object.setPrototypeOf()和getPrototypeOf()5&#xff0c;Object.keys()、values() 和 entries()6&#xff0c;Object.fromEntries()7&#xff0c;…...

半导体存储电路

存储电路 存储单元&#xff1a;只能存储一位数据 寄存器&#xff1a;存储一组数据 存储单元 静态存储单元&#xff1a;包含锁存器和触发器&#xff0c;只要不断电&#xff0c;静态存储单元的状态会一直保持下去。 动态存储单元&#xff1a;利用电容的电荷存储效应来存储数据。…...

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…...

Python SQLAlchemy ( ORM )

From Python中强大的通用ORM框架&#xff1a;SQLAlchemy&#xff1a;https://zhuanlan.zhihu.com/p/444930067Python ORM之SQLAlchemy全面指南&#xff1a;https://zhuanlan.zhihu.com/p/387078089 SQLAlchemy 文档&#xff1a;https://www.sqlalchemy.org/ SQLAlchemy入门和…...

鉴源实验室丨汽车网络安全运营

作者 | 苏少博 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 概 述 1.1 背景 随着车辆技术的不断进步和智能化水平的提升&#xff0c;车辆行业正经历着快速的变革和技术进步。智能化…...

分布式链路追踪之SkyWalking详解和实战

SkyWalking 文章目录 SkyWalking1.SkyWalking概述2.SkyWalking架构设计3.SkyWalking部署4.应用程序接入SkyWalking5.SkyWalking配置应用告警5.1.告警规则5.2.Webhook&#xff08;网络钩子&#xff09;5.3.邮件告警实践 6.项目自动化部署接入SkyWalking6.1 整体思路6.2 启动参数…...

【工程实践】使用EDA(Easy Data Augmentation)做数据增强

工程项目中&#xff0c;由于数据量不够&#xff0c;经常需要用到数据增强技术&#xff0c;尝试使用EDA进行数据增强。 1.EDA简介 EDA是一种简单但是非常有效的文本数据增强方法&#xff0c;是由美国Protago实验室发表于 EMNLP-IJCNLP 2019 会议。EDA来自论文《EDA: Easy Data…...

ClickHouse(十三):Clickhouse MergeTree系列表引擎 - ReplicingMergeTree

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…...

哪些网站可以直接做英文字谜/2024年阳性最新症状

txt转excel粘贴复制只会是一列&#xff0c;很麻烦。 选择用数据里的自文本。 一步步导入就好了。...

网站怎样做注册窗口/合肥网络推广网络运营

go语言是谷歌开发第二款开源编程语言&#xff0c;可专门针对多处理器系统应用程序的编程进行优化&#xff0c;其运行速度快&#xff0c;而且更加安全&#xff0c;并支持并行进程。除此之外&#xff0c;还具有以下优点&#xff1a; 1. go语言部署简单。 go语言编译生成的是一个…...

温州市营销网站建设/推广普通话手抄报内容怎么写

我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ&#xff0c;那这里面都具体包含了那些内容呢&#xff1f; 简介 对于官方的解释&#xff0c;environ是一个字符串所对应环境的映像对象。这是什么意思呢&#xff1f;举个例子来说&#xff0c;environ[…...

asp网站开发实例/直通车关键词怎么选 选几个

我们知道一个类的构造函数指明了当我们定义一个类的对象时会发生什么&#xff0c;这一小节主要讨论另外几个与类的创建及删除有关的概念&#xff1a;复制构造函数&#xff08;当复制一个类的对象时会发生什么&#xff09;&#xff0c;赋值构造操作符&#xff08;当对类的对象进…...

wordpress云落主题/软文广告平台

看到很多朋友问起Eclipse插件问题&#xff0c;所以索性就将自己所用过的总结一下。呵呵&#xff0c;说是全攻略只当胀胀眼球&#xff0c;俺能用过的插件会有多少呀&#xff0c;虽然才疏学浅&#xff0c;为了不让自己的痛苦重复在似俺当年般的菜虫身上…… tomcatPluginV31beta…...

wordpress tag__not_in/百度推广开户电话

1、登录ftp代码:lftp 用户名:密码ftp地址:传送端口&#xff08;默认21&#xff09;用法(1)lftp username:password127.0.0.1:21 回车(2)lftp username127.0.0.1 回车 ##默认21端口 回车后输入密码(3)lftp 127.0.0.1 回车 ##回车后 login 登录(4)lftp 回车 --> open 12…...