创建型模式-Prototype 模式(原型模式)

embedded/2025/2/23 10:42:58/

原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,避免了重复创建对象的开销‌。原型模式的核心在于通过复制现有的实例对象来生成新的实例对象,从而提升效率。‌

场景假设:需要创建复杂配置的仪器连接对象(含IP、端口、校验配置等)

1. 不使用原型模式(直接构造新对象)

class DeviceConnection {
private:string ip;int port;vector<uint8_t> configData; // 大型配置数据
public:// 复杂构造函数(模拟耗时操作)DeviceConnection(string ip, int port) : ip(ip), port(port) {// 模拟耗时配置加载(从文件/数据库读取)this->configData.resize(1024*1024); // 1MB数据std::iota(configData.begin(), configData.end(), 0);}void setValidation(bool enable) { /*...*/ }void print() { cout << ip << ":" << port << endl; }
};// 客户端代码
DeviceConnection conn1("192.168.1.10", 5025); // 耗时构造
DeviceConnection conn2 = conn1; // 仅浅拷贝(危险!)
conn2.setValidation(true);      // 修改会影响conn1吗?

缺点分析:

  1. 重复初始化成本:每个新对象都要执行完整的构造函数逻辑
  2. 浅拷贝风险:默认拷贝构造函数导致configData内存共享
  3. 配置同步问题:修改一个对象的配置不会影响另一个(但共享数据会出问题)

2. 使用原型模式(显式克隆)// 基类实现克隆接口

class ICloneable {
public:virtual unique_ptr<ICloneable> clone() const = 0;virtual ~ICloneable() = default;
};class DeviceConnection : public ICloneable {
private:string ip;int port;vector<uint8_t> configData;
public:// 原型对象构造(仅首次需要耗时)DeviceConnection(string ip, int port) : ip(ip), port(port) {this->configData.resize(1024*1024);std::iota(configData.begin(), configData.end(), 0);}// 实现深拷贝克隆unique_ptr<ICloneable> clone() const override {auto newObj = make_unique<DeviceConnection>(*this);newObj->configData = this->configData; // 显式深拷贝return newObj;}void setIP(string newIP) { ip = newIP; }void print() { cout << ip << ":" << port << endl; }
};// 客户端代码
auto prototype = make_unique<DeviceConnection>("192.168.1.10", 5025);// 快速克隆已有配置
auto conn1 = prototype->clone();
dynamic_cast<DeviceConnection*>(conn1.get())->setIP("192.168.1.11");auto conn2 = prototype->clone();
dynamic_cast<DeviceConnection*>(conn2.get())->setIP("192.168.1.12");

缺点分析:

  1. 类型转换开销:需要dynamic_cast处理具体类型
  2. 内存消耗:克隆大型对象时需要复制全部数据
  3. 接口约束:必须继承ICloneable接口

关键对比表格:

特性原型模式不用原型模式
对象创建速度✅ 快速克隆(避开构造函数)❌ 每次完整构造
内存效率❌ 可能重复存储相同数据✅ 仅保留必要数据
对象状态一致性✅ 确保初始状态一致❌ 依赖构造函数正确性
代码复杂度❌ 需实现克隆接口✅ 直接使用默认构造
多态支持✅ 支持异构对象克隆❌ 只能创建同类对象
配置修改安全性✅ 独立内存空间❌ 默认浅拷贝风险

工程建议:

// 最佳实践:结合工厂模式管理原型
class DeviceFactory {
private:static unordered_map<DeviceType, unique_ptr<DeviceConnection>> prototypes;
public:static void init() {prototypes[DeviceType::SCOPE] = make_unique<DeviceConnection>("192.168.1.100", 5025);// 其他设备类型初始化...}static unique_ptr<DeviceConnection> create(DeviceType type) {return prototypes[type]->clone();}
};

适用场景建议:

•优先使用原型模式:当对象初始化成本 > 克隆成本时
•避免使用原型模式:当对象简单或需要完全独立初始化时


http://www.ppmy.cn/embedded/164601.html

相关文章

大模型监督微调(SFT)技术解析

大模型监督微调&#xff08;SFT&#xff09;技术深度解析 一、基本知识介绍 监督微调&#xff08;Supervised Fine-Tuning&#xff09;是连接预训练与具体应用的关键技术层。其本质是通过特定任务的标注数据&#xff0c;在保持预训练模型核心能力的前提下&#xff0c;调整模型…

z-score算法

z-score算法原理参考网址 https://blog.csdn.net/m0_59596937/article/details/128378641 具体实现代码如下&#xff1a; import numpy as npclass ZScoreOutlierDetector:def __init__(self, threshold3):"""构造函数"""self.threshold thre…

Microsoft Office 2024 软件安装教程(免费)

1.通过百度网盘下载Microsoft Office 2024安装包 下载地址为: https://pan.baidu.com/s/1jk1kvQsKFH9dZGF5xfGgiQ?pwdjbkv 提取码: jbkv 。 2.安装环境 Win10~Win11或更高。 3.安装步骤 &#xff08;1&#xff09;下载压缩包&#xff0c;解压缩。 &#xff08;2&#xf…

【大模型LLM】DeepSeek LLM Scaling Open-Source Language Models with Longtermism

深度探索LLM&#xff1a;以长期主义扩展开源语言模型 0.论文摘要 开源大语言模型&#xff08;LLMs&#xff09;的快速发展确实令人瞩目。然而&#xff0c;以往文献中描述的扩展规律得出了不同的结论&#xff0c;这为LLMs的扩展蒙上了一层阴影。我们深入研究了扩展规律&#…

【JavaEE进阶】MyBatis之动态SQL

目录 &#x1f332;动态SQL &#x1f343;< if >标签 &#x1f333;< trim >标签 &#x1f38d;< where >标签 &#x1f340;< set >标签 &#x1f334;< foreach >标签 &#x1f38b;< include >标签 &#x1f332;动态SQL 动态S…

小游戏-记忆卡牌

1、游戏开始4张卡牌&#xff0c;每次过关后新增两张&#xff0c;总共64张卡&#xff0c;可以修改数组EMOJIS&#xff0c;添加表情&#xff0c;增加卡牌数量 2、新建txt文件&#xff0c;将代码粘贴进去&#xff0c;保存后&#xff0c;将txt修改后缀名为html的格式 <!DOCTYPE…

代码随想录算法训练营day40(补0208)

买卖股票专栏 1.买卖股票最佳时机 贪心法&#xff0c;好想 题目 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖…

Deepseek R1 和其他的大模型 共同辅助决策交通出行方案

比一比各家大模型 问题描述一、Deepseek R1通勤方式评估报告&#xff08;一&#xff09;评分模型说明&#xff08;二&#xff09;各选项评分明细&#xff08;三&#xff09;加权总分计算&#xff08;四&#xff09;结论 二、文心一言通勤方式评估&#xff08;一&#xff09;时间…