实用指南:C++设计模式_创建型模式_原型模式Prototype

news/2025/10/22 18:09:14/文章来源:https://www.cnblogs.com/tlnshuju/p/19158652

实用指南:C++设计模式_创建型模式_原型模式Prototype

2025-10-22 18:06  tlnshuju  阅读(0)  评论(0)    收藏  举报

本文记录原型设计模式。下面举例时,还是以游戏打怪为例给出例子。

原型模式使用场景

**原型模式:**通过一个对象克隆出多个一模一样的对象。
**使用场景:**打BOSS到一半血时,BOSS分裂为两个半血的BOSS。
对象的克隆需要调用类的拷贝构造函数,因为如果直接new 一个类,new出来的是新类,满血的BOSS类,所以new半血的BOSS类,只能通过拷贝构造函数来new;

class CMonster
{
public:
CMonster(int left, int magic, int attack)
:m_life(left)
, m_magic(magic)
, m_attack(attack)
{
}
// 原型模式的克隆函数,使用拷贝构造函数实现
CMonster(const CMonster& obj)
{
cout <<
"CMonster::CMonster(const CMonster& obj)" << endl;
m_life = obj.m_life;
m_magic = obj.m_magic;
m_attack = obj.m_attack;
}
virtual ~CMonster()
{
cout <<
"CMonster::~CMonster()" << endl;
}
// 克隆函数
virtual CMonster* clone() = 0;
// 减少生命值 魔法值,攻击力
virtual void reduce() = 0;
// 输出当前的生命值、魔法值和攻击力
virtual void printStatus() const = 0;
protected:
int m_life;
//生命值
int m_magic;
//魔法值
int m_attack;
//攻击力
};
// 实现三个怪物类
class CUndead
: public CMonster
{
public:
CUndead(int left, int magic, int attack)
: CMonster(left, magic, attack)
{
}
CUndead(const CUndead& obj)
: CMonster(obj)
{
cout <<
"CUndead::CUndead(const CUndead& obj)" << endl;
}
// 克隆函数
virtual CMonster* clone() override
{
return new CUndead(*this);
// 调用拷贝构造函数
}
// 减少生命值 魔法值,攻击力
virtual void reduce() override
{
m_life -= 10;
// 假设每次减少10点生命值
m_magic -= 5;
// 假设每次减少5点魔法值
m_attack -= 2;
// 假设每次减少2点攻击力
}
virtual void printStatus() const override
{
cout <<
"Undead Status: Life = " << m_life
<<
", Magic = " << m_magic
<<
", Attack = " << m_attack << endl;
}
};
class CElement
: public CMonster
{
public:
CElement(int left, int magic, int attack)
: CMonster(left, magic, attack)
{
}
// 调用拷贝构造函数
CElement(const CElement& obj)
: CMonster(obj)
{
}
// 克隆函数原理:每次克隆,new CElement(*this);先会调用拷贝构造函数
// 在拷贝构造函数中,调用了父类CMonster的拷贝构造函数,然后完成了成员变量的拷贝
// 如果没有父类,则直接在本类的拷贝构造函数中完成成员变量的赋值操作
virtual CMonster* clone() override
{
return new CElement(*this);
}
// 减少生命值 魔法值,攻击力
virtual void reduce() override
{
m_life -= 20;
// 假设每次减少10点生命值
m_magic -= 15;
// 假设每次减少5点魔法值
m_attack -= 22;
// 假设每次减少2点攻击力
}
// 输出状态
virtual void printStatus() const override
{
cout <<
"Undead Status: Life = " << m_life
<<
", Magic = " << m_magic
<<
", Attack = " << m_attack << endl;
}
};
void test()
{
// 创建一个亡灵类怪物
CMonster* undead = new CUndead(100, 50, 30);
undead->
printStatus();
// Undead Status: Life = 100, Magic = 50, Attack = 30
undead->
reduce();
undead->
printStatus();
// Undead Status: Life = 90, Magic = 45, Attack = 28
// 克隆一个亡灵类怪物
CMonster* undeadClone = undead->
clone();
undeadClone->
printStatus();
// Undead Status: Life = 90, Magic = 45, Attack = 28
}

克隆函数原理:基于现在的对象数据,拷贝一份新的对象。每次克隆,new CElement(*this);先会调用拷贝构造函数,在拷贝构造函数中,调用了父类CMonster的拷贝构造函数,然后完成了成员变量的拷贝。如果没有父类,则直接在本类的拷贝构造函数中完成成员变量的赋值操作

原型模式定义

用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式的两种角色,
Prototype(抽象原型类):CMonster类;
ConcretePrototype具体原型类,CEle CUndead 。
如果对象内部数据比较复杂多变,并且在创建对象的时候希望保持对象的当前状态,那么用原型模式显然比用工厂方法模式更合适。比如:BOSS的血量不断变化, 需要复制当前的BOSS,此时用原型更方便。

工厂方法模式和原型模式创建对象的共同点

1 都不需要知道所储行间对象所属的类名;工厂模式直接使用工厂来复制,原型模式直接使用clone()方法来复制。
2 工厂方法模式中的createMonster仍旧属于根据类名类生成的新对象;
3 原型模式中的clone() 是生成的当前对象的状态。

原型模式优缺点

1 如果创建新对象内部数据比较复杂多变,原型模式创建对象的效率可能会更高。
2 原型模式不存在额外的等级结构—原型模式不需要额外的工厂类;
3 clone() 接口的实现方法有多种,不用非要在clone()种拷贝构造。
4 有些情况下,产品类中存在一个克隆方法也会给开发提供一些便利。

使用全局方法

// 使用全局方法创建CMonster
void Glb_CreateMonster(CMonster *pMonster)
{
CMonster *p = nullptr;
if (dynamic_cast<CUndead *> (pMonster) != nullptr){cout <<"这是CUndead 类型" << endl;}else if (dynamic_cast<CEle *>(pMonster) != nullptr){cout <<"这是CEle 类型" << endl;}}

原型模式UML

在这里插入图片描述

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

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

相关文章

第二十一篇

今天是10月22号,上了离散和马原。

DEIMv2浅读

DEIMv2代表了实时目标检测领域的一次重大飞跃,它通过空间调谐适配器(STA)、双轨制骨干网络设计、高效解码器优化等创新技术,成功地将DINOv3强大的视觉表示能力引入到对计算资源敏感的实时检测任务中,在精度和效率的平…

阿里出手了:全免费!号称国内版ClaudeCode?

这两年编程的开发工具层出不穷,也是一片红海,前有 Claude、CodeX,后有 Code Buddy、Qwen、Qoder 等。那问题来了,有没有一款好用、且免费的编程工具呢? 那么今天给大家分享 3 款好用且免费的编程工具。 视频分享…

[MS-DOS]MS-DOS 6.22 with CD-ROM Driver.ver.6.22.English下载与安装

下载地址: https://archive.org/details/ms-dos-6.22-with-cd-rom-driver.ver.6.22.english MS-DOS 6.22 with CD-ROM Driver.ver.6.22.English安装视频: How to Install MS-DOS on VirtualBox https://www.youtube.…

2025 年国内品牌设计公司最新推荐排行榜:聚焦行业领军者优势,精选优质服务商深度解析

引言 在当前激烈的市场竞争中,品牌设计已成为企业塑造独特形象、提升核心竞争力的关键环节。然而,品牌设计行业乱象丛生,部分企业缺乏专业体系、过度追求短期利益,导致企业难以找到靠谱的合作伙伴。为帮助企业精准…

报考PostgreSQL中级认证证书多少钱?

近几年随着PostgreSQL数据库在国内的流行,考相关认证的人也多了起来,尤其是使用PostgreSQL数据库的企业,不少员工想了解一下关于PostgreSQL数据库认证的费用、时间、题型、难度等问题,这里做些收费方面的介绍。 首…

087_尚硅谷_switch使用细节(1)

087_尚硅谷_switch使用细节(1)1.swithc细节讨论 2.case和switch 后是一个表达式(即 常量值、变量、一个有返回值的函数等都可以) 3.1.case 后的各个表达式的值的数据类型, 必须和 switch 的表达式数据类型一致,否则程…

linux服务器操作系统字符集是GBK,tomcat和部署的程序是UTF-8,启动后应用界面乱码如何解决

当 Linux 系统编码为 GBK,而 Tomcat 使用 UTF-8 时,程序界面乱码的核心原因是编码 / 解码环节不统一(如 JVM 默认编码、请求响应编码、资源文件编码等不一致)。解决需从多个层面统一编码为 UTF-8,具体步骤如下: …

2025 年感温电缆厂家最新推荐权威榜单重磅发布,全方位解析头部品牌优势助力工业消防精准选型

在工业生产、城市基建等领域,火灾安全防护是保障生命财产安全的核心环节,而感温电缆作为火灾早期探测的关键设备,其品质与性能直接决定防护效果。当前感温电缆市场品牌繁杂,既有深耕多年的老牌企业,也有新兴入局者…

完整教程:2- 十大排序算法(希尔排序、计数排序、桶排序)

完整教程:2- 十大排序算法(希尔排序、计数排序、桶排序)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

预测(笔记)

概念 利用历史数据,推断未来不确定因素的方法。这是基于:过去的规律,一定会在未来不断地发生。可以应用在销售数据、经济走势、产量范围、劳动力需求等。在项目PERT中,我们用均值、方差计算出某个时间完成的概率,…

分词器模型

中文分词是NLP中一个独特且富有挑战性的任务,因为中文文本没有像英文空格那样的天然词语边界。 现代分词器模型(尤其是基于Transformer的模型如BERT、GPT等使用的中文分词器)主要采用子词分词算法,但其处理方式与英…

Windows Server 2025 安装IIS服务

2 3 3、在弹出的添角色和功能向导中选择下一步 4、选择:基于角色或基于功能的安装,然后下一步 5、选择:从服务器池中选择服务器,然后下一步 6、选择:Web服务器(IIS),在弹出的对话框选择添加功能 7、确保web服…

易路薪酬能力深度解析:以科技赋能企业薪酬管理新范式

前言:中国薪酬管理的数字化变革与易路的核心价值 在当前数字经济浪潮的推动下,中国企业的薪酬管理正经历一场前所未有的深刻变革。传统的薪酬管理模式,因其固有的效率低下、数据孤立、决策滞后等弊端,已难以适应瞬…

LaTeX 项目结构优化:从基础到专业

LaTeX 项目结构优化:从基础到专业LaTeX 项目结构优化:从基础到专业 在上一篇文章《在 VS Code 中集成 LaTeX 环境并创建第一个文档》中,我们介绍了如何搭建基础的 LaTeX 开发环境。本文将进一步探讨如何将简单的 La…

Java的优势有哪些

Java 的价值 当具有开创性的 Java 白皮书在 1995 年推出该语言时,它列出了七项使其超越竞争对手的核心价值。如今,Java 为在 AWS 和 Google Cloud 等主要云上运行的大规模系统提供动力,这使得这些价值对于现代部署和…

今日开启!飞书 燕千云年终钜惠活动来袭

从今日开启,燕千云联合飞书推出年终限时钜惠推广活动,新老用户皆可获得权益。燕千云携手飞书,共创高效智能的企业IT服务新时代!燕千云此次携手飞书发起联合推广活动,共同助力企业提升内部IT服务体验与协同效率。从…

2025 年 LFT 材料源头厂家最新推荐权威榜单:复合 / 注塑 / 增强 / 轻量化 / 长碳纤 / 长玻纤 / 耐高温 LFT 材料优质公司推荐

当前 LFT 材料在汽车、新能源、航空航天等领域的应用愈发广泛,市场需求持续攀升,但行业乱象却让众多采购方和合作企业陷入选择困境。一方面,市场上 LFT 材料厂家数量繁杂,部分厂家缺乏核心生产技术,产品性能波动大…

CF1842G Tenzing and Random Operations 题解

CF1842G Tenzing and Random Operations 题解 方法一:组合意义 虽然确实是对的但是怎么想出来。 方法二:大力推式子 设 \(f_{i,j}\) 表示考虑前 \(i\) 个位置,执行了 \(j\) 次操作的方案权值和,则有: \[f_{i,k}=(…

PHP验证码生成与测试 - 详解

PHP验证码生成与测试 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…