原型模式-C++实现

原型模式是一种创建型设计模式,它允许通过克隆现有的对象来生成新的对象,而不是通过实例化新对象。

原型模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些“异变类”有稳定的接口。

举例:
假设有一个游戏中的怪物类 Monster,每个怪物有不同的属性和行为。在游戏中,需要动态创建大量的怪物对象。

// 怪兽基类
class Monster
{
protected:std::string monster_name_;public:virtual ~Monster() {}virtual std::shared_ptr<Monster> Clone() = 0;virtual void Info() = 0;virtual void SetMonsterName(const std::string& _name) = 0;
};// 具体怪兽类
class Goblin: public Monster
{
public:Goblin(const std::string& _monster_name){monster_name_ = _monster_name;}virtual std::shared_ptr<Monster> Clone() override{return std::make_shared<Goblin>(*this);}virtual void Info() override{std::cout << "这是" << monster_name_ << "怪兽" << std::endl;}virtual void SetMonsterName(const std::string& _name) override{monster_name_ = _name;}
};class Skeleton: public Monster
{
public:Skeleton(const std::string& _monster_name){monster_name_ = _monster_name;}virtual std::shared_ptr<Monster> Clone() override{return std::make_shared<Skeleton>(*this);}virtual void Info() override{std::cout << "这是" << monster_name_ << "怪兽" << std::endl;}virtual void SetMonsterName(const std::string& _name) override{monster_name_ = _name;}
};

测试:

void TestPrototype()
{// 创建原型怪兽std::shared_ptr<Monster> goblin = std::make_shared<Goblin>("小龙");std::shared_ptr<Monster> skeleton = std::make_shared<Skeleton>("大龙");goblin->Info();skeleton->Info();goblin->SetMonsterName("黑暗暴君");// 动态的创建大量怪兽for (int i = 0; i < 5; i++){std::shared_ptr<Monster> temp = goblin->Clone();temp->Info();}
}

输出:

这是小龙怪兽
这是大龙怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽
这是黑暗暴君怪兽

我们创建了一个怪兽基类,两个具体的怪兽类,测试代码中我们先是创建了两个不同的原型怪兽类,通过for循环创建大量的怪兽类。

我们可以看到它们其实都是保持独立并且具有相同的状态。

原型模式适用于以下场景:

1、当一个系统需要创建大量相似对象时,可以使用原型模式来提高性能和减少内存消耗。通过克隆原型对象,可以避免重复执行相同的初始化操作,从而减少对象创建的开销。

2、当一个对象的创建过程比较复杂或者需要访问外部资源时,可以使用原型模式来简化对象的创建过程。可以通过克隆原型对象并对其进行适当的修改,快速创建一个新对象,而无需重新执行复杂的初始化过程或访问外部资源。

3、当需要动态地添加或删除对象时,可以使用原型模式来简化对象的创建和管理。可以创建一个原型对象,然后根据需要克隆多个相同类型的对象,并进行相应的修改。

4、当希望隐藏对象的具体类型,并通过通用接口来操作对象时,可以使用原型模式。克隆出来的对象可以统一使用原型的抽象类型,对外部代码透明,增加了灵活性。

简化一下:

原型模式具有以下优点:

1、简化对象创建:原型模式通过复制现有对象来创建新对象,避免了繁琐的初始化过程,使得对象创建变得简单且灵活。

2、提高性能:相比于直接创建对象,原型模式的对象复制效率更高,可以节省不必要的资源消耗。

3、动态添加和修改对象:通过修改原型对象的属性,可以动态地创建和

4、修改新对象,无需编写额外的代码进行变化。

5、隐藏实现细节:原型模式隐藏了对象创建的细节,使得客户端无需关注对象的创建过程,只需关注如何获取新的对象。

缺点:

1、对象克隆可能较为复杂:如果对象内部存在深层次的引用关系,需要保证克隆的完整性,并正确处理对象的引用关系,可能会增加代码的复杂性。

2、需要使用原型管理器:通过原型模式创建对象时需要维护原型对象的管理,增加了系统的复杂性。

3、克隆方法的实现可能受限:在某些编程语言中,对象的克隆方法可能受限于语言本身的特性,例如私有属性的克隆等。

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

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

相关文章

5分钟教你轻松搭建Web自动化测试框架

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…

数学建模值TOPSIS法及代码

TOPSIS法 TOPSIS法简称为优劣距离解法&#xff0c;是一种常见法综合评价方法&#xff0c;其能充分利用原始数据的信息&#xff0c;其结果能精确地反映各个评价方案之间的差距。 模型介绍 上篇文章谈到的层次分析法是有局限性的。比如评价的决策层不能太多&#xff0c;太多的…

ISP--Black Level Correction(黑电平矫正)

图像的每一个像素点都是由一个光电二极管控制的&#xff0c;由二极管将电信号&#xff0c;转换为数字信号。 那么&#xff0c;我们知道了&#xff0c;图像的像素值是与电信号强度相关的。但是&#xff0c;我们得知道&#xff0c;每一个光电二极管要想工作&#xff0c;都得有一定…

Three.js相机模拟

有没有想过如何在 3D Web 应用程序中模拟物理相机? 在这篇博文中,我将向你展示如何使用 Three.js和 OpenCV 来完成此操作。 我们将从模拟针孔相机模型开始,然后添加真实的镜头畸变。 具体来说,我们将仔细研究 OpenCV 的两个失真模型,并使用后处理着色器复制它们。 拥有逼…

arm开发板

一个简单的hello world程序 minicom用来和开发板之间交互并且可以向开发板传输文件。打印hello world字符串。在linux虚拟机上编译我的代码&#xff0c;使用的交叉编译工具是arm-linux-gnueabihf-gcc (hard float) 可以使用 readelf -h libc.so.6 查看开发板是不是&#xff08…

MATLAB程序设计课后作业三、四

1、课程中学习到kmeans聚类函数&#xff0c;查询kmeans算法的基本原理&#xff0c;还有什么其他类型的聚类算法&#xff1f; 层次聚类算法&#xff0c;它不需要预先指定簇的个数&#xff0c;而是通过构建数据点的层次结构来进行聚类&#xff0c;可以得到不同层次的聚类结果。一…

C/C++最大质因子 2021年12月电子学会中小学生软件编程(C/C++)等级考试一级真题答案解析

目录 C/C最大质因子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C最大质因子 一、题目要求 1、编程实现 质因子是指能整除给定正整数的质数。而最大质因子是指一个整数的所有质因子中最大的那个。…

开源集群管理系统对比分析:Kubernetes 与 Apache Mesos

集群管理系统是关键的软件解决方案&#xff0c;可以在互连机器网络中有效分配和利用计算资源。毫无疑问&#xff0c;它们通过确保可扩展性、高可用性和有效的资源管理在现代计算中发挥着至关重要的作用&#xff0c;这使得它们对于运行复杂的应用程序、管理数据中心以及进一步增…

数据分析基础之《jupyter notebook工具》

一、安装库 1、linux库 yum install python3-devel 2、python库 pip3 install -U matplotlib pip3 install -U numpy pip3 install -U pandas pip3 install -U TA-Lib pip3 install -U tables pip3 install -U notebook 3、如果TA-Lib安装不上&#xff0c;先手动安装依赖库 …

cadence layout lvs时出现error

Error&#xff1a;Schematic export failed or was cancelled.Please consult the transcript in the viewer window. 解决办法同下&#xff1a; cadence layout lvs时出现error-CSDN博客

城市智慧路灯智能照明管理系统简介

城市路灯存在着开关灯控制方式单、亮灯时间不准确、巡查困难、故障处理不及时、亮灯率无法把控等问题&#xff0c;从而导致路灯系统能耗高&#xff0c;维护成本高。传统的路灯控制系统已无法满足智慧城市管理的需要&#xff0c;智能路灯照明控制系统从而得到广泛应用。 叁仟智…

在python中分别利用numpy,tensorflow,pytorch实现数据的增加维度(升维),减少维度(降维)

文章目录 前言一、使用numpy实现升维度&#xff0c;降维度二、使用TensorFlow实现升维度&#xff0c;降维度三、使用PyTorch实现升维度&#xff0c;降维度总结 前言 我们明确一下升维和降维的概念&#xff1a; 升维&#xff08;Dimensionality Augmentation&#xff09;&…

目标检测YOLO实战应用案例100讲-基于改进YOLOv5s的道路目标检测

目录 前言 国内外研究现状 传统目标检测方法 基于深度学习的目标检测方法

WebSocket --- ws模块源码解析(详解)

摘要 在这一篇文章中&#xff0c;写了如何在node端和web端&#xff0c;实现一个WebSocket通信。 WebSocket在node端和客户端的使用 而在node端里面&#xff0c;我们使用了ws模块来创建WebSocket和WebSocketServer&#xff0c;那ws模块是如何做到可以和客户端进行双向通信的呢…

前端本地存储数据库IndexedDB

前端本地存储数据库IndexedDB 1、前言2、什么是 indexedDB&#xff1f;3、什么是 localForage&#xff1f;4、localForage 的使用5、VUE 推荐使用 Pinia 管理 localForage 1、前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff…

树莓派镜像安装 + 设置 + 镜像批量化操作 - 自动化烧写工具 (四)

简介 当需要大批量使用树莓派时, SD Card烧录过程中的重复和繁杂操作需要被工具给取代, AT Disk Imager这就出现了;软件介绍 实现监控读卡器&#xff0c;当SD Card接入读卡器时自动格式化、 烧写设定镜像、并自动软弹出设备;目前可设定参数: 1) 镜像文件&#xff0c; 烧录的镜…

[github配置] 远程访问仓库以及问题解决

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

MATLAB算法实战应用案例精讲-【神经网络】Transformer

目录 前言 算法原理 编码器 自注意力机制 从宏观视角看自注意力机制

Vue3 源码解读系列(九)——依赖注入

依赖注入 依赖注入用于祖先组件向后代组件传递数据。 特点&#xff1a; 祖先组件不需要知道哪些后代组件在使用它提供的数据。 后代组件也不需要知道注入的数据来自哪里。 /*** provide 的实现*/ function provide(key, value) {let provides currentInstance.provides // 当…