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

news2024/12/22 23:51:44


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

💥💥💥欢迎来到🤞汤姆🤞的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.coloradmin.cn/o/645046.html

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

相关文章

IDEA中类模板注释和方法注释模板

类注释 /* *ClassName ${NAME} *Author --你的别名 *Description //TODO *Date ${DATE} ${TIME} *Version 1.0 **/ 把上面的代码粘贴到settings-editor-file and code templates下的class的“public class”和#parese的中间 2.方法注释 /* *Author --你的别名 *Description …

ZK+麦克风:反AI音频认证

1. 引言 当前&#xff0c;已越来越难以区分AI生成的音频与人类的声音。可能带来欺诈、身份盗用以及其它滥用问题。 在AI生成的音频可以完美模仿人声的当前环境中&#xff0c;需要一个可靠的信任链——从最初的音频捕获到最终的播放。这种信任链可以使用加密技术建立&#xff…

Java实训日志04

文章目录 八、项目开发实现步骤&#xff08;六&#xff09;创建数据访问接口1、创建学校数据访问接口2、创建状态数据访问接口3、创建学生数据访问接口4、创建用户数据访问接口 八、项目开发实现步骤 &#xff08;六&#xff09;创建数据访问接口 DAO: Data Acess Object - 数…

antd-vue - - - - - upload组件的使用

upload组件的使用 参数说明&#xff1a; file:list : 上传列表数据 name: 上传时的key data: 上传时额外的参数 header: 上传列表数据 actions: 上传接口地址 before-upload: 上传之前的回掉 change: 传文件改变时 // 变量定义updateData: { billId: "", fileType: &…

Flutter 自定义Grade组件

/*** images 图片数组* titles title数组* length_w 一行的数量* length_h 行数*/static Widget getMenuGrade(List<String> images, List<String> titles, int length_w, int length_h) {int startIndex 0;List<Widget> rowList [];List<List<Widge…

docker-compose服务名称和容器名称区别

需求及结论 在docker-compose文件一般书写如下&#xff1a; version: 3.8 x-logging: &default-loggingoptions:max-size: "200m"max-file: "5"driver: json-file x-environment: &default-environmentTZ: Asia/ShanghaiLANG: C.UTF-8 services:…

前端什么最难学?

前言 个人认为是JS&#xff0c;无论是在平时的项目或者找工作时候JS都是大头&#xff0c;相比起其他的部分&#xff0c;它相对而言是难一点&#xff0c;同时也是十分重要的一部分&#xff0c;学好原生JS&#xff0c;后续的学习才能基于此循序渐进&#xff0c;下面是我总结的关…

(2023 最新版)大厂面试必问的1000道Java面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#x…

报表生成器FastReport .Net用户指南:“SVG”对象

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

数据库|TiDB灾备切换实践-部署

刘昊 | 数据库工程师 最近手头有个系统&#xff0c;有需要搭建灾备库的需求&#xff08;RTO要求4小时内&#xff0c;根据实际情况计算&#xff09;。考虑到生产系统是5版本&#xff0c;TiCDC存在一些兼容性问题&#xff0c;且TiDB Binlog已经有实践案例及经验可供参考&#xf…

SpringCloud Eureka注册服务提供者(七)

这里我们在原来的服务提供者项目 microservice-student-provider-1001 上面直接修改&#xff1a; 首先pom.xml修改&#xff0c;加上eureka客户端依赖&#xff1a; <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>…

【MySQL高级篇笔记-数据库备份与恢复(下) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、物理备份与逻辑备份 二、mysqldump实现逻辑备份 1、 备份一个数据库 2、备份全部数据库 3、备份部分数据库 4、备份部分表 5、备份单表的部分数据 6、排除某些表的备份 7、只备份结构或只备份数据 8、备份中包含存储过…

2023开放原子全球开源峰会展区“云游图鉴”,带你畅游开源世界!

2023 开放原子 全球开源峰会 畅游回顾 2023 开放原子全球开源峰会&#xff0c;6 月 11 日-13 日在北京圆满举行&#xff01; 一大批开源人从四面八方奔来&#xff0c;共赴这场盛会&#xff0c;在开源技术新世界里畅快云游&#xff01; 科技骨干企业、开源高端项目&#xff0…

前端眼里的Docker概念、工作流和实践-前端开发者也需要掌握Docker:加速你的开发流程

如果现在有个厨王争霸赛&#xff0c;比赛的菜式是做一道&#x1f414;相关的菜式&#xff0c;选手们需要做不同的鸡&#xff0c;有需要公鸡和母鸡的&#xff0c;有需要鸡仔的&#xff0c;为了让选手们完美的进行比赛&#xff0c;主办方为每个选手准备了独立厨房&#xff0c;厨房…

代码随想录算法训练营第五十七天|647. 回文子串|516.最长回文子序列

LeetCode647. 回文子串 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;本题如果我们定义&#xff0c;dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的话&#xff0c;会发现很难找到递归关系。dp[i] 和 dp[i-…

【备战秋招】每日一题:4月29日美团春招:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

好用的Windows数据恢复软件--傲梅恢复之星

​数据恢复软件有什么用&#xff1f; 现在&#xff0c;人们拥有大量的文件需要保留和保护&#xff0c;包括照片、视频、文档、游戏等等。了解数据安全的用户会利用云存储服务和外部设备来存储和备份重要的数据。 但更多的用户并不重视数据备份。这样做是相当危险的&#xf…

网络安全进阶学习第一课——认证崩溃之弱口令与暴力破解

文章目录 一、什么是弱口令&#xff1f;二、暴力破解1、暴力破解攻击产生原因2、暴力破解分类3、具体案例 一、什么是弱口令&#xff1f; 弱口令没有严格和准确的定义&#xff0c;通常认为它是容易被别人猜测到或被工具破解的口令均为弱口令。 在允许社会工程学攻击的情况下&…

一文搞懂 AB Testing 的分层分流

一、定义 在网络分析中&#xff0c;A / B测试&#xff08;桶测试或分流测试&#xff09;是一个随机实验&#xff0c;通常有两个辩题&#xff0c;A和B。利用控制变量法保持有单一变量的前提下&#xff0c;将A、B数据进行对比&#xff0c;得出实验结论。 二、简述 通常网站会利…

CentOS7配置教程(十三)安装Python3

由于 yum install python3 默认安装的 Python 版本较低&#xff0c;&#xff08;也可能自带了python3的版本过低&#xff09;现如今有更高版本的 Python 需求&#xff0c;就想用编译安装的方法安装一个较高版本的 Python&#xff0c;顺道记录一下安装过程。 注意&#xff1a;不…