原型模式(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.hqwc.cn/news/485392.html

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

相关文章

springmvc+ssm+springboot房屋中介服务平台的设计与实现 i174z

本论文拟采用计算机技术设计并开发的房屋中介服务平台&#xff0c;主要是为用户提供服务。使得用户可以在系统上查看房屋出租、房屋出售、房屋求购、房屋求租&#xff0c;管理员对信息进行统一管理&#xff0c;与此同时可以筛选出符合的信息&#xff0c;给笔者提供更符合实际的…

数字孪生城市为何备受追捧?其应用场景有多宽?

数字孪生的“虚拟副本”让城市治理不再盲人摸象。 从城市治理的角度来看&#xff0c;数字孪生城市相当于真实世界的“操作系统”&#xff0c;有了它就可以远程对城市的每一个角落进行监测、智慧调度&#xff0c;无论是街道、社区&#xff0c;还是商场、变电站乃至城市排水系统…

文献速递:GAN医学影像合成--基于生成对抗网络的肺部图像分类的多域医学图像翻译生成

文献速递&#xff1a;GAN医学影像合成–基于生成对抗网络的肺部图像分类的多域医学图像翻译生成 01 文献速递介绍 在2019年底&#xff0c;一种称为2019冠状病毒病&#xff08;COVID-19&#xff09;的新型冠状病毒肺炎出现&#xff0c;迅速成为全球性大流行。感染COVID-19可以…

链表头部插入一个节点

运行情况&#xff1a; //头部插入一个节点 #include <stdlib.h> #include <stdio.h> struct Node {int data;struct Node* next; //这是指向Node的指针&#xff0c;将存储下一个Node的地址 //C语言&#xff1a;struct Node* next; //C&#xff1a; Node* next; }…

【开源】JAVA+Vue.js实现考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

[HTML]Web前端开发技术27(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

opencv判断灰化情况

目的 先说说理论&#xff1a; 在图像处理中&#xff0c;用RGB三个分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即红、绿、蓝三原色来表示真彩色&#xff0c;R分量&#xff0c;G分量&#xff0c;B分…

ESP8266智能家居(1)——开发环境的搭建

1.前期介绍 本次打算使用esp8266的开发板——NodeMCU&#xff0c;进行物联网相关项目的学习。开发环境使用Arduino软件。 NodeMCU实物图为&#xff1a; 开发环境截图为&#xff1a; 2.软件下载 我使用的arduino版本为1.8.5&#xff0c;其安装包如下&#xff1a; 【免费】ar…

【FPGA】高云FPGA之数字钟实验->HC595驱动数码管

高云FPGA之IP核的使用 1、设计定义2、设计输入2.1 数码管译码显示2.2 74HC595驱动2.3 主模块设计 3、分析和综合4、功能仿真6.1 hex8模块仿真6.2 HC595模块 5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#…

【数据集】GSOD全球逐日气象站点日度数据

GSOD全球逐日气象站点日度数据 1 数据简介1.1 字段说明1.2 单位换算2 数据下载参考1 数据简介 Global Surface Summary of the Day - GSOD数据,本套数据衍生自The Integrated Surface Hourly (ISH)数据集,从1929年至今,包括全球超9000个站点的气象观测数据。 官网-Global S…

C++:string类

标准库中的string类 string类 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持&#xff0c;其接口类似于标准字符容器的接口&#xff0c;但添加了专门用于操作单字节字符字符串的设计特性。 3. string类是使用char(即作为它的字符类型&#xff0c;使用…

RV新闻概要 --- 2024/02/23

来源&#xff1a;https://mp.weixin.qq.com/s/EEJVLQnXvgQTbtU_yrW9lw 晶心科技是一家上市公司&#xff08;TWSE&#xff1a;6533&#xff1b;SIN&#xff1a;US03420C2089&#xff1b;ISIN&#xff1a;US03420C1099&#xff09;&#xff0c;已有18 年的经营历史&#xff0c;是…