《复制粘贴的奇迹:小明的原型工厂》

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

📖 背景故事

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

"老板,再来一个上次的奶茶+水果!"

"老样子,照搬昨天晚上的宵夜套餐!"

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

于是小明灵机一动:

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

这时,原型模式救场了!

🌈 生活中类似的例子

  • Word 文档点"复制" → "粘贴"

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

  • 套餐模板、一键下单

😵 如果不用原型模式

每次都用建造者一步一步构建套餐?效率太低了!

用工厂创建?每次还要重新传配置?麻烦!

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

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

✅ 原型模式结构

  • 原型接口:定义 clone 方法

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

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

🧠 原型模式 C++ 示例

抽象原型类
cpp 复制代码
class ComboPrototype {
public:
    virtual ComboPrototype* clone() = 0;
    virtual void show() = 0;
    virtual ~ComboPrototype() {}
};
具体原型类:奶茶 + 水果 套餐
cpp 复制代码
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;
    }
};
具体原型类:烧烤+可乐 宵夜套餐
cpp 复制代码
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;
    }
};
客户端代码
cpp 复制代码
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;
}
🤯 不使用原型模式怎么办?
cpp 复制代码
// 每次都得重新 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!🙌"

相关推荐
牛油果子哥q1 小时前
C++STL算法超全精讲:排序/查找/去重/遍历/最值/合并全套API、仿函数、Lambda适配、实战避坑
开发语言·c++·算法
Xeon_CC1 小时前
用C++编写屏幕准星
开发语言·c++
星恒随风2 小时前
C++ 哈希详解(二):开放定址、哈希桶与 C++ 哈希表底层实现
c++·笔记·学习·哈希算法·散列表
lingran__2 小时前
C++ STL unordered系列(哈希) 底层剖析与模拟实现万字详解 | 基于哈希表,复刻 SGI-STL 泛型哈希容器架构
开发语言·c++·后端·哈希算法·哈希表·泛型编程·unordered系列
鸿芯微控科技3 小时前
MFC设定流量达不到怎么办?上游供气能力、压差与管路阻力排查
c++·mfc·质量流量控制器·流量不足排查·压差测试·气体流量控制
烬羽3 小时前
NestJS 依赖注入:Controller 里那个没有 new 的 service,到底从哪来的?
设计模式·typescript·nestjs
郝学胜_神的一滴3 小时前
C++20 高级编程 003:吃透现代基础语法与标准容器
c++
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的关联容器
开发语言·c++·面试
Hhy_11074 小时前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio
晚风叙码4 小时前
C++哈希表实现:开放定址法和链地址法 (哈希桶)
数据结构·c++·哈希算法·散列表