👨?🎓 模式名稱:原型模式(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!🙌”