原型模式(Prototype Pattern) C++

上一节:建造者模式(Builder Pattern)C++

文章目录

  • 0.理论
    • 1.原型模式的核心组成:
    • 2.实现方法
    • 3.什么时候使用
  • 1.实践
    • 步骤 1: 定义怪物原型
    • 步骤 2: 实现具体怪物原型
    • 步骤 3: 使用原型创建怪物

0.理论

原型模式(Prototype Pattern)是一种创建型设计模式,其思想是基于一个原型实例创建对象的副本,从而避免新实例创建时的标准方式(如使用new关键字)。在需要创建的对象与原有对象类似或者创建过程较为复杂时,使用原型模式可以更高效地复制对象。

在这里插入图片描述

1.原型模式的核心组成:

  • 原型(Prototype):一个接口或抽象类,定义了复制(克隆)自身的方法。
  • 具体原型(Concrete Prototype):实现原型接口的类的实例,这个实现包括如何克隆自身的具体操作。
  • 客户(Client):使用原型实例创建新对象的类。

2.实现方法

  • 浅克隆(Shallow Clone):复制对象时仅复制对象本身和对象中的原始类型的字段值,而不复制对象引用指向的对象。浅克隆可以快速复制,但不包括对象内部的引用对象。
  • 深克隆(Deep Clone):复制对象时,除了对象本身和原始类型的字段值外,还递归地复制对象中的所有引用对象。深克隆使得副本与原始对象在结构上完全独立,修改副本不会影响原始对象。

3.什么时候使用

  • 当直接创建一个对象的成本较高或复杂时,使用原型模式可以简化对象的创建过程。
  • 当需要重复地创建相似对象时,可以利用已有对象进行克隆,减少创建对象的开销。
  • 当需要实现对象的撤销和恢复功能时,通过保存对象的克隆副本来实现。

1.实践

假设我们正在开发一个游戏,其中包含大量的怪物。这些怪物分为几种类型,比如“地精”、“龙”等。每种怪物都有自己的属性(如生命值、攻击力等),但同种类型的怪物在初始状态下这些属性是相同的。在游戏中,我们需要频繁地创建同类型的怪物实例。为了提高性能和简化创建过程,我们可以使用原型模式来实现怪物的创建。

步骤 1: 定义怪物原型

首先,定义一个怪物原型基类,其中包含一个虚拟的克隆方法:

#include <iostream>// 怪物原型基类
class Monster {
public:virtual ~Monster() {}virtual Monster* clone() const = 0;virtual void attack() const = 0;
};

步骤 2: 实现具体怪物原型

然后,为每种怪物类型实现具体的原型类:

// 地精怪物
class Goblin : public Monster {
public:Goblin* clone() const override {return new Goblin(*this);}void attack() const override {std::cout << "Goblin attacks! Damage: 10" << std::endl;}
};// 龙怪物
class Dragon : public Monster {
public:Dragon* clone() const override {return new Dragon(*this);}void attack() const override {std::cout << "Dragon breathes fire! Damage: 100" << std::endl;}
};

步骤 3: 使用原型创建怪物

最后,在游戏逻辑中,我们可以通过克隆原型来创建新的怪物实例:

int main() {// 创建原型Goblin* goblinPrototype = new Goblin();Dragon* dragonPrototype = new Dragon();// 克隆新怪物Monster* goblin1 = goblinPrototype->clone();Monster* dragon1 = dragonPrototype->clone();// 使用怪物实例进行攻击演示goblin1->attack();dragon1->attack();// 清理资源delete goblinPrototype;delete dragonPrototype;delete goblin1;delete dragon1;return 0;
}

原型模式可以在不知道对象具体类型的情况下克隆对象,并减少子类的构造。也可以可以避免构造函数的约束,因为对象的复制通常是通过某种复制方法实现的。

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

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

相关文章

7-liunx服务器规范

目录 概况liunx日志liunx系统日志syslog函数openlog 可以改变syslog默认输出方式 &#xff0c;进一步结构化 用户信息进程间的关系会话ps命令查看进程关系 系统资源限制改变工作目录和根目录服务器程序后台话 概况 liunx服务器上有很多细节需要注意 &#xff0c;这些细节很重要…

服务网格Service Mesh和Istio

文章目录 服务网格&#xff08;Service Mesh&#xff09;市场上三种服务网格解决方案服务网格的特征流量管理安全性可观察性 Istio简介Istio提供了什么功能服务 &#xff1f;Istio 核心特性流量管理安全可观察性 平台支持 服务网格&#xff08;Service Mesh&#xff09; 服务网…

Eureka注册中心(黑马学习笔记)

Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f; 有多个user-service实例地址&#xff0c…

TreeData 数据查找

TreeData 数据查找 最近做需求的时候遇到了这样的一个需求&#xff0c;Tree组件数据支持查找&#xff0c;而且TreeData的数据层级是无限级的 开始想的事借助UI组件库&#xff08;Ant-design-vue&#xff09;中的Tree组件的相关方法直接实现,看了下api 发现没法实现&#xff0c;…

超级实用的python代码片段汇总和详细解析(16个)

目录 1. 生成随机文本 2. 计算文本文件中的字数 3. 替换文件文件中的字串 4. 多文件名的批量替换 5. 从网站提取数据 6. 批量下载图片 7.批量删除空文件夹 8.Excel表格读写 9.合并Excel表格工作簿 10.数据库SQL查询 11. 系统进程查杀 12.图像尺寸调整和裁剪 13.图…

redis实现消息队列redis发布订阅redis监听key

文章目录 Redis消息队列实现异步秒杀1. jvm阻塞队列问题2. 什么是消息队列3. Redis实现消息队列1. 基于List结构模拟消息队列操作优缺点 2. 基于PubSub发布订阅的消息队列操作优缺点spring 结合redis的pubsub使用示例1. 引入依赖2. 配置文件3. RedisConfig4. CustomizeMessageL…

大语言模型的开山之作—探秘GPT系列:GPT-1-GPT2-GPT-3的进化之路

模型模型参数创新点评价GPT1预训练微调&#xff0c; 创新点在于Task-specific input transformations。GPT215亿参数预训练PromptPredict&#xff0c; 创新点在于Zero-shotZero-shot新颖度拉满&#xff0c;但模型性能拉胯GPT31750亿参数预训练PromptPredict&#xff0c; 创新点…

pclpy 可视化点云(多窗口可视化、单窗口多点云可视化)

pclpy 可视化点云&#xff08;多窗口可视化、单窗口多点云可视化&#xff09; 一、算法原理二、代码三、结果1.多窗口可视化结果2.单窗口多点云可视化 四、相关数据五、问题与解决方案1.问题2.解决 一、算法原理 原理看一下代码写的很仔细的。。目前在同一个窗口最多建立2个窗…

ESP8266智能家居(3)——单片机数据发送到mqtt服务器

1.主要思想 前期已学习如何用ESP8266连接WIFI&#xff0c;并发送数据到服务器。现在只需要在单片机与nodeMCU之间建立起串口通信&#xff0c;这样单片机就可以将传感器测到的数据&#xff1a;光照&#xff0c;温度&#xff0c;湿度等等传递给8266了&#xff0c;然后8266再对数据…

【AI应用】SoraWebui——在线文生视频工具

SoraWebui 是一个开源项目&#xff0c;允许用户使用 OpenAI 的 Sora 模型使用文本在线生成视频&#xff0c;从而简化视频创建&#xff0c;并具有轻松的一键网站部署功能 在 Vercel 上部署 1. 克隆项目 git clone gitgithub.com:SoraWebui/SoraWebui.git 2. 安装依赖 cd Sor…

【Java EE初阶二十】http的简单理解(一)

1. 初识http HTTP 最新的版本应该是 HTTP/3.0&#xff0c;目前大规模使用的版本 HTTP/1.1&#xff1b; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同&#xff0c;HTTP 的报文格式&a…

React基础-webpack+creact-react-app创建项目

学习视频&#xff1a;学习视频 2节&#xff1a;webpack工程化创建项目 2.1.webpack工程化工具&#xff1a;vite/rollup/turbopak; 实现组件的合并、压缩、打包等&#xff1b; 代码编译、兼容、校验等&#xff1b; 2.2.React工程化/组件开发 我们可以基于webpack自己去搭建…

sql-labs25-28a

一、环境 网上都有不过多阐述 二、sql-labs第25关 它说你的OR和and属于它,那就是过滤了OR和and 注入尝试 不用or和and进行爆破注入,很明显是有注入点的 ?id-1 union select 1,2,3-- 查看数据库 ok&#xff0c;此道题算是解了但是如果我们用了and了呢 ?id-1 and updatex…

浅谈集群的分类

本文主要介绍集群部署相关的知识&#xff0c;介绍集群部署的基础&#xff0c;集群的分类、集群的负载均衡技术&#xff0c;集群的可用性以及集群的容错机制。随后介绍Redis-Cluster以及Mysql的架构以及主从复制原理。 集群介绍 单台服务器本身会受到带宽、内存、处理器等多方面…

STM32-串口通信(串口的接收和发送)

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结&#xff0c;各…

大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术&#xff0c;很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务&#xff0c;关键词搜索是构建搜索系统最常用的方法&#xff0c;最常用的搜索算法是Okapi BM25&#x…

Liunx使用nginx和http搭建yum-server仓库

文章目录 1. yum-server的搭建方式2. nginx搭建yum-server仓库2.1. 安装配置nginx2.2 配置yum-server的rpm2.3. 同步yum源相关包2.3.1 rsync同步源3.3.1 reposync同步源 2.4. 配置客户端访问yum配置2.5. 验证测试 3. http服务搭建yum-server仓库3.1. 安装配置http3.2 配置yum-s…

Firewalld防火墙

Firewalld概述 Firewalld firewalld防火墙是centos7系统默认防火墙的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也是工作在网络层&#xff0c;属于包过滤防火墙。 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具至此IPv4、IPv6…

studio one 6正版多少钱?怎么购买studio one 更便宜,有优惠券哦

Presonus Studio One Studio One是由美国PreSonus公司开发的数字音频工作站&#xff0c;作为DAW届的新人&#xff0c;功能强大且全面&#xff0c;虽然它不像其他DAW那样拥有历史和声誉&#xff0c;但它是一个可爱的软件&#xff0c;包含许多其它DAW所不具备的实用功能&#xff…

web基础及http协议 (二)----------Apache相关配置与优化

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…