C++ 设计模式《复制粘贴的奇迹:小明的原型工厂》

👨‍🎓 模式名称:原型模式(Prototype Pattern)

📖 背景故事

创业初期,小明每天加班写配送路线、配送策略、营销套餐。可当业务做大后,他发现大家常常下单“上次那个套餐”——

“老板,再来一个上次的奶茶+水果!”
“老样子,照搬昨天晚上的宵夜套餐!”

每天都要重新构建这些复杂的套餐组合,小明手速再快也累趴下了 🥵。

于是小明灵机一动:

“能不能把这些常见套餐复制粘贴,用一个模子刻出来?”💡

这时,原型模式救场了!

🌈 生活中类似的例子

  • Word 文档点“复制” → “粘贴”

  • 游戏角色自定义后,保存为模板,创建新角色时快速复制

  • 套餐模板、一键下单

😵 如果不用原型模式

每次都用建造者一步一步构建套餐?效率太低了!
用工厂创建?每次还要重新传配置?麻烦!

💡 小明的解决方案:原型模式登场!

小明定义了所有套餐都必须支持“克隆”,然后把常见的“模板套餐”先存下来,当用户要下单时,直接拷贝一份,改一点点就行了!

✅ 原型模式结构

  • 原型接口:定义 clone 方法

  • 具体原型类:实现 clone 自我复制

  • 客户端:调用 clone 得到新的对象

🧠 原型模式 C++ 示例

抽象原型类
class ComboPrototype {
public:virtual ComboPrototype* clone() = 0;virtual void show() = 0;virtual ~ComboPrototype() {}
};
具体原型类:奶茶 + 水果 套餐
class MilkTeaFruitCombo : public ComboPrototype {
public:std::string name;MilkTeaFruitCombo() {name = "经典奶茶水果套餐 🍹🍉";}ComboPrototype* clone() override {return new MilkTeaFruitCombo(*this);}void show() override {std::cout << name << std::endl;}
};
具体原型类:烧烤+可乐 宵夜套餐
class BBQNightCombo : public ComboPrototype {
public:std::string name;BBQNightCombo() {name = "深夜烧烤可乐套餐 🍖🥤";}ComboPrototype* clone() override {return new BBQNightCombo(*this);}void show() override {std::cout << name << std::endl;}
};
客户端代码
int main() {// 小明的模板库ComboPrototype* prototype1 = new MilkTeaFruitCombo();ComboPrototype* prototype2 = new BBQNightCombo();// 用户:我要“老样子”套餐!ComboPrototype* order1 = prototype1->clone();ComboPrototype* order2 = prototype2->clone();// 展示结果std::cout << "下单成功!您的套餐是:" << std::endl;order1->show();order2->show();// 清理delete prototype1;delete prototype2;delete order1;delete order2;return 0;
}
🤯 不使用原型模式怎么办?
// 每次都得重新 new + 配置属性
class Combo {
public:std::string name;Combo(const std::string& n) : name(n) {}void show() { std::cout << name << std::endl; }
};int main() {Combo* combo1 = new Combo("经典奶茶水果套餐 🍹🍉");Combo* combo2 = new Combo("深夜烧烤可乐套餐 🍖🥤");combo1->show();combo2->show();delete combo1;delete combo2;
}

缺点:

  • 重复构造逻辑
  • 如果对象构造复杂,效率低
  • 不便于复制已有对象的全部状态

💬 小明的总结(带表情包)

“每次重复创建套餐,累得像🐂!现在我直接复制模板,一键下单,效率飙升⚡!原型模式,YYDS!🙌”

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

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

相关文章

【Elasticsearch】映射:fielddata 详解

映射&#xff1a;fielddata 详解 1.fielddata 是什么2.fielddata 的工作原理3.主要用法3.1 启用 fielddata&#xff08;通常在 text 字段上&#xff09;3.2 监控 fielddata 使用情况3.3 清除 fielddata 缓存 4.使用场景示例示例 1&#xff1a;对 text 字段进行聚合示例 2&#…

开源 vGPU 方案:HAMi,实现细粒度 GPU 切分

本文主要分享一个开源的 GPU 虚拟化方案&#xff1a;HAMi&#xff0c;包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案&#xff0c;HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制&#xff0c;保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…

PlayDiffusion上线:AI语音编辑进入“无痕时代”

在语音合成与语音编辑领域&#xff0c;一个长期存在的挑战是如何在修改语音内容的同时&#xff0c;保持原始语音的自然性、连贯性和说话人特征。近日&#xff0c;一款名为 PlayDiffusion 的新型 AI 语音修复模型应运而生&#xff0c;成功实现了这一目标。 PlayDiffusion 是一个…

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…

微信小程序前端面经

一、技术栈与编码能力&#xff08;10min&#xff09; 1. Vue 3 & Composition API Q1&#xff1a;请解释一下 ref 和 reactive 的区别&#xff1f;你在项目中是如何使用的&#xff1f; 答&#xff1a;ref是包装一个原始值或对象&#xff0c;通过.value访问&#xff0c;r…

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…

Houdini POP入门学习07 - 分组

使用PopGroup可对粒子进行分组操作&#xff0c;并通过表达式从而更灵活的处理粒子行为。 1.创建box作为发射器&#xff0c;连接popnet节点。 2.双击进入popnet&#xff0c;添加popwind添加向上风力。现在播放粒子可见粒子向上方移动。 3.添加popgroup进行分组&#xff0c;开启…

机器学习复习3--模型评估

误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为&#xff1a;误差&#xff08;error&#xff09;。 误差定义&#xff1a; ①在训练集上的误差称为训练误差&#xff08;training error&#xff09;或经验误差&#xff08;empirical error&#x…

Docker 镜像上传到 AWS ECR:从构建到推送的全流程

一、在 EC2 实例中安装 Docker&#xff08;适用于 Amazon Linux 2&#xff09; 步骤 1&#xff1a;连接到 EC2 实例 ssh -i your-key.pem ec2-useryour-ec2-public-ip步骤 2&#xff1a;安装 Docker sudo yum update -y sudo amazon-linux-extras enable docker sudo yum in…

MobileNet 改进:基于MobileNetV2和SSPP的图像分类

1.创新点分析 在计算机视觉领域,高效的图像分类模型一直是研究热点。 本文将详细解析一个结合了MobileNetV2和空间金字塔池化(SSPP)的深度学习模型实现。 模型概述 这个代码实现了一个轻量级但功能强大的图像分类器,主要包含两个核心组件: MobileNetV2作为特征提取器 自定…

Java中List的forEach用法详解

在 Java 中&#xff0c;List.forEach() 是 Java 8 引入的一种简洁的遍历集合元素的方法。它基于函数式编程思想&#xff0c;接受一个 Consumer 函数式接口作为参数&#xff0c;用于对集合中的每个元素执行操作。 基本语法 java 复制 下载 list.forEach(consumer); 使用示…

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…

计算机视觉与深度学习 | 基于MATLAB的相机标定

基于MATLAB的相机标定:原理、步骤与代码实现 相机标定 基于MATLAB的相机标定:原理、步骤与代码实现MATLAB相机标定完整流程1. 准备工作2. 采集标定图像3. 导入图像并检测角点4. 生成世界坐标5. 执行相机标定6. 分析标定结果7. 应用标定结果校正图像相机标定关键概念相机参数类…

物联网专业核心课程以及就业方向

物联网专业作为信息技术与产业应用深度融合的交叉学科&#xff0c;其课程体系覆盖硬件、软件、网络、数据等全链条技术&#xff0c;就业方向则随智能技术普及呈现多元化趋势。以下是基于最新行业动态与教育实践的系统分析&#xff1a; &#x1f4da; 一、物联网专业核心课程体系…

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…

线性代数证明:把行列式的某一行(列)的k倍加到另一行(列),行列式的值不变

线性代数证明 把行列式的某一行&#xff08;列&#xff09;的k倍加到另一行&#xff08;列&#xff09;&#xff0c;行列式的值不变&#xff1a; 注意五角星的位置要用到另一条性质&#xff1a;若行列式的某一行&#xff08;列&#xff09;的元素都是两数之和&#xff0c;则可以…

webrtc 在线测试, 如何在线拉流测试

1. 如下所示&#xff0c;使用腾讯提供的网页即可&#xff0c;非常赞&#xff0c;测试直播拉流 webrtc协议 WebRTC Player Demo 2.截图&#xff1a;

基于Flask前后端分离智慧安防小区系统

基于Flask前后端分离智慧安防小区系统 本项目是一个基于前后端分离架构的智慧安防小区管理系统&#xff0c;采用现代化的技术栈和完善的功能设计&#xff0c;旨在提供一个高效、安全的小区管理解决方案。 技术架构 前端技术栈 基于Vue 3框架开发参考Geeker-Admin项目的基础…