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

news2024/12/23 17:57:14


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

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

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

相关文章

vue3-实战-09-管理后台-SKU模块开发

目录 1-需求原型分析 2-功能模块开发 2.1-列表页面数据获取和展示 2.2-上架下架sku 2.3-更新sku信息 2.4-查看sku详情 2.5-删除sku 1-需求原型分析 列表页面就是el-card里面放置el-table结构&#xff0c;下面有个el-pagination组件显示分页器。点击查看详情的时候有个抽…

java SSM 学生住宿管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 学生住宿管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

【指针数组】

指针数组 1. 指针运算1.1 指针-整数1.2 指针-指针1.3 指针的关系运算 2. 指针和数组3. 二级指针4. 指针数组 1. 指针运算 指针 整数 指针-指针 指针的关系运算 1.1 指针整数 #define N_VALUES 5 float values[N_VALUES]; float *vp; //指针-整数&#xff1b;指针的关系运算 …

基于Python的招聘信息可视化系统,附源码

文章目录 1 简介2 技术栈3 总体设计3.1 系统结构3.2 数据库设计3.2.1 数据库实体3.2.2 数据库表设计 4 运行设计4.1 招聘热门行业分析4.2热门岗位分析界面4.3招聘岗位学历分析界面4.4岗位分布分析界面 5 源码下载 1 简介 基于Python的招聘信息可视化系统,通过对招聘数据进行分…

界面开发框架Qt新手入门指南 - 使用Calendar组件创建日历(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的CalendarWi…

docker ansible与剧本模式

ansible&#xff08;跨主机编排&#xff09; ansible 是一个基于python开发的配置管理和应用部署和管理工具&#xff0c;现在也在自动化管理领域大放异彩&#xff0c;他融合了众多老牌运维工具的优点&#xff0c;pubbet和saltstack能实现的功能&#xff0c;ansible基本上都可以…

antd-vue - - - - - table增加统计行?

table增加统计行 尝试一、footer & Summary使用summary尝试二、直接将统计行push进dataSource 第一次遇到这个需求&#xff0c;有点懵。 在【antd-v table】官网仔细看了一番&#xff0c;找到这么两个配置footer[表格尾部]和Summary[总结栏]  所以可以证明&#xff0c;你所…

TDEngine3.x数据查询及插入调优

一、数据库创建 vgroups 配置 如果不了解vgroup概念&#xff0c;建议到官网查看&#xff1a;TDEngine官网-数据模型和整体架构 从服务端配置的角度&#xff0c;要根据系统中磁盘的数量&#xff0c;磁盘的 I/O 能力&#xff0c;以及处理器能力在创建数据库时设置适当的 vgroups…

Qt编写onvif工具(搜索/云台/预置位/OSD/录像存储)

一、前言 从最初编写这个工具开始的时间算起来&#xff0c;至少5年多&#xff0c;一直持续完善到今天&#xff0c;这个工具看起来小也不小大也不大&#xff0c;但是也是经历过无数个现场的洗礼&#xff0c;毫不夸张的说&#xff0c;市面上能够遇到的主流的厂商的设备&#xff…

【Flutter】如何 Dialog 弹窗设置点击空白处不关闭

文章目录 一、 引言二、 Flutter 中的 Dialog 弹窗1. 默认的 Dialog 行为介绍2. 解释为什么在某些情况下我们需要点击空白处不关闭 Dialog 三、 如何在 Flutter 中设置 Dialog 弹窗点击空白处不关闭1. 展示简单的代码示例2. 详细解释代码的每个部分 四、 一个完整的 Flutter Di…

SpringCloud服务注册与发现组件Eureka(五)

Eureka github 地址&#xff1a; https://github.com/Netflix/eureka Eureka简介 Eureka是Netflix开发的服务发现框架&#xff0c;本身是一个基于REST的服务&#xff0c;主要用于定位运行在AWS域中的中间层服务&#xff0c;以达到负载均衡和中间层服务故障转移的目的。Spring…

迈入大模型时代,多模态AI通用化成未来趋势,景联文科技提供多模态数据集

ChatGPT带来2023年第一个火爆的风口。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;拥有语言理解和文本生成能力。无论是强大的视频脚本、文案、邮件、翻译、代码等内容生成能力&#xff0c;还是语义推理、情绪分析等对话能力&#xff0c;都让大众眼前一亮&#xf…

C++类和对象(继承)

4.6继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减…

阿里云PAIx达摩院GraphScope开源基于PyTorch的GPU加速分布式GNN框架

作者&#xff1a;艾宝乐 导读 近期阿里云机器学习平台 PAI 团队和达摩院 GraphScope 团队联合推出了面向 PyTorch 的 GPU 加速分布式 GNN 框架 GraphLearn-for-PyTorch(GLT) 。GLT 利用 GPU 的强大并行计算性能来加速图采样&#xff0c;并利用 UVA 来减少顶点和边特征的转换和…

Spring Security Oauth2.1 最新版 1.1.0 整合 gateway 完成授权认证(拥抱 springboot 3.1)

目录 背景 版本 Spring Boot 3.1 Spring Authorization Server 1.1.0官方文档 基础 spring security OAuth2.0 模块构成 授权方式 集成过程 官方demo 代码集成 依赖 授权服务AuthorizationServerConfig配置 重要组件 测试 查看授权服务配置 访问授权服务 授…

AB32VG1:SDK_AB53XX_V061(5)蓝牙BLE测试笔记

文章目录 1.配置工程&#xff0c;重新编译1.1替换链接库libbtstack_dm.a1.2 《config.h》打开编译开关1.3 在 Downloader 里面打开 BLE 开关 2.ABLink&#xff08;手机APP&#xff09;控制2.1 app下载2.2 安装后打开&#xff0c;搜索蓝牙Bluetrum&#xff1a;2.3 操作存储卡 3.…

深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型、LEO模型、Reptile模型

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

华为认证 | HCIP-Datacom-Core 考试大纲

01 考试概况 02 考试内容 HCIP-Datacom-Core Technology V1.0考试覆盖数据通信领域各场景通用核心知识&#xff0c;包括路由基础、OSPF、 IS-IS、BGP、路由和流量控制、以太网交换技术、组播、IPv6、网络安全、网络可靠性、网络服务与管理、 WLAN、网络解决方案。 ★路由基础 …

【MySQL 函数】:一文彻底搞懂 MySQL 函数(一)

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL字符串函数和数学函数的讲解✨ 目录 前言一、字符串函数二、数学函数三、总结 一、字符串函数 函数作用UPPER(列|字符串)将字符串每个字符转为大写LOWER(列|字符串)将字符串每个字符转为小写CONCAT(str1,str2,…

阿里云企业邮箱购买流程

阿里云企业邮箱购买流程&#xff0c;企业邮箱分为免费版、标准版、集团版和尊享版&#xff0c;阿里云百科分享企业邮箱版本区别&#xff0c;企业邮箱收费标准价格表&#xff0c;以及阿里企业邮箱详细购买流程&#xff1a; 目录 阿里云企业邮箱购买流程 一、阿里云账号注册及…