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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86505.shtml
英文地址,請注明出處:http://en.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項目的基礎…