2023-6-14-第五式原型模式

news/2024/10/21 10:20:02/


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之原型模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、原型模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有对象来创建新对象,而不必从头开始编写代码。在原型模式中,每个对象都被视为一个原型,可以通过克隆(clone)操作来创建新的实例。

原型模式适用于需要创建大量相似对象的场景,例如游戏中的敌人、枪支等物品。使用原型模式可以避免重复创建和初始化相同的对象,提高应用程序的性能和效率。

在原型模式中,一般会定义一个抽象的原型类,该类包含一个克隆方法,用于返回当前对象的副本。具体的原型类则继承自抽象原型类,并实现其克隆方法。在创建新对象时,我们只需要从已有的原型对象中进行克隆即可,无需重新构建对象。

原型模式有两种实现方式:浅克隆和深克隆浅克隆是指复制对象时只复制基本类型的数据成员,而不复制引用类型的数据成员;深克隆则是指复制对象时同时复制引用类型的数据成员。

总之,原型模式是一种通过复制现有对象来创建新对象的设计模式,它可以提高应用程序的性能和效率,适用于需要创建大量相似对象的场景。在使用原型模式时,需要定义抽象的原型类,并实现其克隆方法。


🐱‍🐉二、原型模式实现

原型模式的实现可以分为以下几个步骤:

  1. 创建抽象原型类:抽象原型类定义了克隆方法,该方法用于复制当前对象并返回副本。具体的原型类需要继承该抽象原型类,并实现其克隆方法。
class Prototype {
public:virtual ~Prototype() {}virtual Prototype* clone() = 0;
};
  1. 创建具体原型类:具体原型类继承抽象原型类,并实现其克隆方法。在克隆方法中,需要将自己的数据成员复制到新创建的对象中。
class ConcretePrototype : public Prototype {
public:ConcretePrototype(int value) : m_value(value) {}Prototype* clone() override {return new ConcretePrototype(m_value);}int getValue() const {return m_value;}private:int m_value;
};
  1. 创建客户端代码:在客户端代码中,我们可以通过调用原型对象的克隆方法来创建新的对象。由于每个对象都是从某个原型对象克隆而来,因此它们之间具有相同的属性和行为。
int main() {ConcretePrototype* prototype = new ConcretePrototype(10);ConcretePrototype* clone = dynamic_cast<ConcretePrototype*>(prototype->clone());std::cout << "Original object: " << prototype->getValue() << std::endl;std::cout << "Cloned object: " << clone->getValue() << std::endl;delete prototype;delete clone;return 0;
}

在上述代码中,我们首先创建了一个具体原型对象ConcretePrototype,并将其值设置为10。然后,我们通过调用原型对象的克隆方法来创建一个新的对象,并输出它们的值。最后,我们释放了这些对象的内存空间。


🎉三、模块之间的关系

在原型模式中,通常存在以下三个角色:

  1. 抽象原型类(Prototype):定义了克隆方法,用于复制当前对象并返回副本。

  2. 具体原型类(Concrete Prototype):继承抽象原型类,并实现其克隆方法。在克隆方法中,需要将自己的数据成员复制到新创建的对象中。

  3. 客户端代码(Client):通过调用原型对象的克隆方法来创建新的对象。由于每个对象都是从某个原型对象克隆而来,因此它们之间具有相同的属性和行为。

在原型模式中,客户端代码通常不需要知道具体原型类的名称,而只需要通过抽象原型类来访问它们的克隆方法。这样可以降低模块之间的耦合度,并提高系统的灵活性和可扩展性。

另外,具体原型类之间也可能存在关系,例如通过继承或实现共享某些数据成员或方法。在这种情况下,我们可以通过在具体原型类的克隆方法中进行适当的处理来保证复制后的新对象的正确性。


🐱‍🚀四、注意事项

使用原型模式时需要注意以下几点:

  1. 克隆对象的效率:由于克隆操作是基于内存的复制,因此在处理大量数据时可能会导致性能下降。如果需要进行高效的对象创建和复制操作,可以考虑使用其他创建型设计模式(如工厂模式)。

  2. 对象的状态:在使用原型模式时,需要注意克隆出来的新对象与原型对象之间的状态关系。一些数据成员或方法可能只适用于原型对象,而不适用于克隆对象。因此,在实现具体原型类时需要注意这些问题,并进行适当的处理。

  3. 引用类型的数据成员:在克隆对象时,如果对象中包含引用类型的数据成员,则需要进行深度复制以保证对象的正确性。否则,克隆出来的新对象可能会与原型对象产生共享同一个引用的问题。

  4. 多层克隆:在某些情况下,我们可能需要对克隆出来的新对象进行多次克隆操作,即对新对象再进行克隆操作。在这种情况下,我们需要确保每一层的克隆操作都能够正确地进行,并且不会影响到前一层的克隆结果。


🎂五、使用场景

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

  1. 对象的创建比较复杂或者耗时:如果需要创建的对象比较复杂,或者需要进行复杂的初始化操作,那么使用原型模式可以避免重复地执行这些操作。

  2. 需要避免构造函数和初始化过程:有些类的构造函数和初始化过程可能比较复杂,或者包含了一些不必要的操作,使用原型模式可以避免这些问题。

  3. 需要避免使用new操作符:在某些情况下,使用new操作符创建对象可能会导致资源泄漏或者内存碎片等问题。使用原型模式可以避免这些问题,并且能够降低内存分配的负担。

  4. 需要保证对象的状态一致性:在某些场景中,需要确保多个对象之间的状态是一致的,这时就可以使用原型模式来创建相同的对象,并且保证它们之间的状态一致性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于原型模式的一些内容






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

http://www.ppmy.cn/news/381575.html

相关文章

大模型开源简史,追赶chatGPT的重要推手!

大型语言模型&#xff08;LLMs&#xff09;已经彻底改变了人工智能领域&#xff0c;它们的长期影响力越来越强大。OpenAI的ChatGPT是一种高度先进的对话型人工智能&#xff0c;在最近几个月取得了重大突破&#xff0c;引发了公司和研究人员之间的激烈竞争。许多人正竞相开发最先…

vue3开发需要注意的问题

1、声明基本类型 数据声明现在的一般规则是&#xff1a; 使用 reactive 代替 Object, Array, Map, Set使用 ref 代替 String, Number, Boolean <script lang"ts" setup>import { reactive, ref } from vue;const num reactive(0); // value cannot be made…

每日算法(第二十二期)

先来回顾一下上期的问题及答案&#xff1a; 「三数之和」&#xff08;3Sum&#xff09;。以下是题目的描述&#xff1a; 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c&#xff0c;使得 a b c 0&#xff1f;找出所…

RTK 定位回传数据转内网(局域网)mqtt协议--- 格林恩德 CR102 RTK 针对无人机巡检应用

先简单介绍一下CR102 格林RTK高精度设备&#xff0c;CR102接收机&#xff0c;集成高精度模组与4G&#xff0c; WIFI/蓝牙通信模组&#xff1b;双天线定位定向&#xff0c; 同时内置惯导&#xff0c; 输出加速度和姿态信息。支持4G/WIFI/蓝牙无线传输、 LAN网口传输&#xff1b;…

Android使用WebView与Native交互的三种方式 ( 附源码 )

先附上assets目录中html的源代码文件内容&#xff0c;下面的demo都是使用这几个文件&#xff1a; javascript.html: <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>Carson</title><script>function callAn…

华为OD机试真题 JavaScript 实现【火星文计算】【2022Q2 100分】,附详细解题思路

一、题目描述 已知火星人使用的运算符为#、$&#xff0c;其与地球人的等价公式如下&#xff1a; x#y 2*x3*y4 x$y 3*xy2 其中x、y是无符号整数&#xff1b;地球人公式按C语言规则计算&#xff1b;火星人公式中&#xff0c;$的优先级高于#&#xff0c;相同的运算符&#x…

swagger Unable to find a model that matches key ModelKey

Unable to find a model that matches key ModelKey… 在开发RESTful API的过程中&#xff0c;使用swagger可以方便地进行API文档管理和测试。然而&#xff0c;有时候我们可能会遇到swagger无法找到匹配的模型的问题。本文将介绍如何解决swagger无法找到匹配的模型的问题&…

SpringCloud Eureka注册中心高可用集群配置(八)

当注册中心扛不住高并发的时候&#xff0c;这时候 要用集群来扛&#xff1b; 我们再新建两个module microservice-eureka-server-2002 microservice-eureka-server-2003 第一步&#xff1a; pom.xml 把依赖加下&#xff1a; <dependencies> <dependency…