原型模式在C++中的實現與面向對象設計原則

引言

在軟件開發中,原型模式是一種常用的設計模式,主要用于創建對象的克隆。通過原型模式,我們可以避免復雜的對象創建過程,尤其是當對象的初始化需要大量資源或復雜操作時。本文將通過一個具體的例子,詳細介紹如何在C++中實現原型模式,并探討其在面向對象設計原則中的應用。

實現步驟

  1. 定義基類

首先,我們需要定義一個基類YongYong,它將作為所有具體行為類的父類。基類中包含兩個純虛函數:clone()execute()

class YongYong {
public:virtual ~YongYong() {}virtual shared_ptr<YongYong> clone() const = 0;virtual void execute() const = 0;
};
  • clone():用于克隆當前對象,返回一個指向新對象的智能指針。
  • execute():用于展示具體的行為,每個子類將根據自己的行為實現該方法。
  1. 創建具體行為類

接下來,我們創建三個具體的行為類,分別繼承自YongYong,并實現各自的clone()execute()方法。

拿著飯碗吃飯的行為類

class EatYongYong : public YongYong {
public:EatYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<EatYongYong>(*this);}void execute() const override {cout << "勇勇拿著飯碗在吃飯。" << endl;}
};

打壓下屬的行為類

class PressYongYong : public YongYong {
public:PressYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<PressYongYong>(*this);}void execute() const override {cout << "勇勇在打壓下屬。" << endl;}
};

欺騙領導的行為類

class DeceiveYongYong : public YongYong {
public:DeceiveYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<DeceiveYongYong>(*this);}void execute() const override {cout << "勇勇在欺騙領導。" << endl;}
};
  1. 創建管理類

為了管理不同行為的YongYong對象,我們創建一個YongYongManager類。該類使用map存儲不同行為的原型對象,并提供獲取原型對象的方法。

class YongYongManager {
private:map<string, shared_ptr<YongYong>> prototypes;public:YongYongManager() {prototypes["eat"] = make_shared<EatYongYong>();prototypes["press"] = make_shared<PressYongYong>();prototypes["deceive"] = make_shared<DeceiveYongYong>();}shared_ptr<YongYong> getPrototype(const string& type) const {auto it = prototypes.find(type);if (it != prototypes.end()) {return it->second->clone();}return nullptr;}
};
  1. 使用管理類創建對象

main函數中,我們使用YongYongManager創建不同行為的YongYong對象,并調用它們的execute()方法。

int main() {YongYongManager manager;// 創建吃飯的勇勇shared_ptr<YongYong> yongYong1 = manager.getPrototype("eat");yongYong1->execute();// 創建打壓下屬的勇勇shared_ptr<YongYong> yongYong2 = manager.getPrototype("press");yongYong2->execute();// 創建欺騙領導的勇勇shared_ptr<YongYong> yongYong3 = manager.getPrototype("deceive");yongYong3->execute();return 0;
}

代碼解釋

基類YongYong

  • 虛析構函數:確保子類對象能夠正確析構。
  • 純虛函數clone():定義克隆方法,子類必須實現。
  • 純虛函數execute():定義行為方法,子類必須實現。

具體行為類

每個具體行為類(如EatYongYong)都繼承自YongYong,并實現以下方法:

  • 構造函數:初始化對象。
  • clone()方法:返回自身對象的克隆。
  • execute()方法:展示具體行為。

管理類YongYongManager

  • prototypes:存儲不同行為的原型對象。
  • 構造函數:初始化原型對象。
  • getPrototype()方法:根據類型返回對應的原型對象的克隆。

main函數

  • 創建YongYongManager實例。
  • 使用getPrototype()方法獲取不同行為的YongYong對象。
  • 調用execute()方法展示行為。

面向對象設計原則分析

  1. 單一職責原則(SRP)
  • 基類YongYong:職責明確,定義克隆和行為方法。
  • 具體行為類:每個類只實現一個具體行為。
  • 管理類YongYongManager:職責單一,管理原型對象。
  1. 開閉原則(OCP)
  • 基類YongYong:允許子類擴展行為,無需修改基類。
  • 管理類YongYongManager:通過添加新的行為類擴展功能,無需修改現有代碼。
  1. 里氏替換原則(LSP)
  • 具體行為類:可以替換基類YongYong對象,確保代碼正確性。
  1. 依賴倒置原則(DIP)
  • 管理類YongYongManager:依賴于抽象的YongYong接口,而不是具體實現。
  1. 接口隔離原則(ISP)
  • 基類YongYong:定義清晰的接口,無冗余方法。
  • 具體行為類:只實現需要的方法。
  1. 合成復用原則(CRP)
  • 管理類YongYongManager:通過組合管理對象,而不是通過繼承復用代碼。

總結

通過實現原型模式,我們成功地創建了不同行為的“勇勇”對象,并滿足了多種面向對象設計原則。這種方法不僅提高了代碼的可擴展性和可維護性,還展示了如何通過繼承和接口實現靈活的行為管理。希望本文能夠幫助讀者更好地理解和應用原型模式以及相關的面向對象設計原則。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94418.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringCloud學習------Gateway詳解

在微服務架構中&#xff0c;隨著服務數量的激增&#xff0c;如何統一管理服務入口、實現請求路由、保障服務安全等問題日益突出。SpringCloud Gateway 作為 Spring 官方推出的網關組件&#xff0c;憑借其強大的功Gateway 是 Spring 官方基于 Spring、SpringBoot 和 Project Rea…

計算機網絡:子網掩碼在路由轉發中的關鍵作用

在路由表中,子網掩碼是一個不可或缺的組成部分,其核心作用是精確界定IP地址中“網絡位”和“主機位”的邊界,從而實現路由器對數據包的準確轉發。以下從多個角度詳細解釋其必要性: 1. 區分網絡位與主機位,定位目標網絡 IP地址由“網絡標識”(網絡位)和“主機標識”(主…

14.Home-新鮮好物和人氣推薦實現

新鮮好物實現1.準備模板<script setup>import HomePanel from ./HomePanel.vue</script><template><homePanel></HomePanel><!-- 下面是插槽主體內容模版<ul class"goods-list"><li v-for"item in newList" :ke…

Linux 系統重置用戶密碼指南

Linux 系統重置用戶密碼指南 在 Linux 系統運維中&#xff0c;重置用戶密碼&#xff08;尤其是 root 密碼&#xff09;是一項核心技能。當您忘記密碼時&#xff0c;可以通過進入單用戶模式或恢復模式來修改密碼。此方法適用于大多數 Linux 發行版&#xff0c;如 RHEL/CentOS、D…

[自動化Adapt] GUI交互(窗口/元素) | 系統配置 | 非侵入式定制化

第三章&#xff1a;GUI交互&#xff08;窗口/元素&#xff09; 各位OpenAdapt探索者&#xff0c;歡迎回來~ 在第一章&#xff1a;錄制引擎中&#xff0c;我們揭示了OpenAdapt如何通過"眼睛和耳朵"捕捉所有操作細節。接著在第二章&#xff1a;數據模型中&#xff0c…

Java 模版進階

文章目錄模版通配符模版 通配符 實例 import java.util.ArrayList; import java.util.List;class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message message;} } public class test {public …

統計魚兒分布情況 Java

假設有一個池塘&#xff0c;管理員在池塘中添加隨機數量的魚類&#xff0c;為了統計魚類的分布情況&#xff0c;他將池塘劃分為8*8的二維網格&#xff0c;魚兒隨機游動&#xff0c;但是每個網格中最多容納100條魚&#xff0c;要求編寫程序顯示魚兒分布情況&#xff0c;并計算魚…

【HUST】計算機|大學計算機基礎內容(純科普向)+數據結構數組、樹、隊列【舊文搬運】

最初發布時間&#xff1a;2020-09-19 23:17:48 以前寫這篇文章&#xff0c;主要是接觸到一些非計算機學院的同學&#xff0c;為了交流方便我寫下了這篇文章……雖然現在回過頭來看寫得也比較草率&#xff0c;但確實是我對電腦的基礎操作的最早的認識&#xff0c;放到現在我絕對…

CRT調試堆檢測:從原理到實戰的資源泄漏排查指南

在C/C開發中&#xff0c;內存泄漏和資源管理不當是導致程序崩潰、性能下降的常見原因。微軟提供的C運行時庫&#xff08;CRT&#xff09;內置了強大的調試工具&#xff0c;能夠幫助開發者在開發階段及時發現并修復資源泄漏問題。本文將深入解析CRT調試堆的工作原理&#xff0c;…

filezilla出現connected refused的時候排查問題

問題描述: 系統是ubuntu20.04&#xff0c;使用filezilla&#xff0c;兩個主機之間能夠ping通&#xff0c;但是filezilla使用sftp連接的時候顯示的是 FATAL ERROR: Connection refused Could connect to the server應該如何排查問題呢 這是一個非常典型的SFTP連接問題。“Connec…

FPGA 基本設計思想--乒乓操作、串并轉換、流水線

乒乓操作&#xff08;Ping-Pong&#xff09;的理解&#xff1a;為什么是另一種pipeline&#xff1f;-CSDN博客 FPGA菜鳥學習筆記——2、四大設計思想 - 知乎 乒乓操作&#xff08;Ping-Pong&#xff09;-CSDN博客 乒乓操作原理與FPGA設計-CSDN博客 乒乓操作 — [野火]FPGA …

2023 年 6 月 GESP Python 二級試卷真題+答案+解析

2023 年 6 月 GESP Python 二級試卷解析 一、單選題&#xff08;每題 2 分 &#xff0c;共 30 分&#xff09; 1 、 高級語言編寫的程序需要經過以下&#xff08; &#xff09;操作&#xff0c;可以生成在計算機上運行的可執行代碼。 A. 編輯 B. 保存 C. 調試…

數據對齊:如何處理時間序列與空間對齊問題?

在多模態學習中&#xff0c;不同模態&#xff08;文本、語音、圖像、視頻、傳感器數據等&#xff09;具有不同的采樣率、時間步長、空間分辨率。例如&#xff0c;視頻是連續幀&#xff0c;音頻是高采樣頻率的波形&#xff0c;文本是離散符號序列。為了實現有效融合&#xff0c;…

兩個任務同一個調用時間 CRON:0 0 3 * * ?,具體如何調度的,及任務如何執行的

xxLjob兩個任務 pullGuanjiaSalesJob&#xff0c;不同的執行參數&#xff0c;配置了同一個 XxlJob("pullGuanjiaSalesJob")兩個任務同一個調用時間 CRON&#xff1a;0 0 3 * * ?&#xff0c;具體如何調度的&#xff0c;及任務如何執行的在 XXL-JOB 中&#xff0c;當…

【基于WAF的Web安全測試:繞過Cloudflare/Aliyun防護策略】

當Cloudflare或阿里云WAF矗立在Web應用前端&#xff0c;它們如同智能護盾&#xff0c;過濾惡意流量。然而&#xff0c;真正的Web安全測試不止于驗證防護存在&#xff0c;更需挑戰其邊界——理解并模擬攻擊者如何繞過這些先進防護&#xff0c;才能暴露深藏的風險。這不是鼓勵攻擊…

使用YOLOv8-gpu訓練自己的數據集并預測

本篇將教學使用示例代碼訓練自己的數據集&#xff08;train&#xff09;以及預測&#xff08;predict&#xff09;。 目錄 一、代碼獲取 二、訓練 1、添加自己的訓練集 2、創建訓練集設置文件 3、 修改訓練代碼中數據集設置文件 4、開始訓練 三、預測 1、 修改圖片路徑…

Transformer的并行計算與長序列處理瓶頸

Transformer相比RNN&#xff08;循環神經網絡&#xff09;的核心優勢之一是天然支持并行計算&#xff0c;這源于其自注意力機制和網絡結構的設計.并行計算能力和長序列處理瓶頸是其架構特性的兩個關鍵表現&#xff1a; 并行計算&#xff1a;指 Transformer 在訓練 / 推理時通過…

LightRAG:大模型時代的低成本檢索利器

LightRAG&#xff1a;大模型時代的低成本檢索利器 大模型浪潮下&#xff0c;RAG 技術的困境與曙光 在科技飛速發展的當下&#xff0c;大語言模型&#xff08;LLMs&#xff09;已成為人工智能領域的璀璨明星。從最初驚艷世人的 GPT-3&#xff0c;到如今功能愈發強大的 GPT-4&…

spring boot開發中的資源處理等問題

文章目錄一、RESTful 風格二、Spring Boot 靜態資源處理三、Spring Boot 首頁&#xff08;歡迎頁&#xff09;四、PathVariable 注解五、攔截器&#xff08;Interceptor&#xff09;六、過濾器&#xff08;Filter&#xff09;七、觸發器&#xff08;Trigger&#xff09;八、Han…

[2025CVPR-圖象生成方向]ODA-GAN:由弱監督學習輔助的正交解耦比對GAN 虛擬免疫組織化學染色

?研究背景與挑戰? ?臨床需求? 組織學染色(如H&E和IHC)是病理診斷的核心技術,但IHC染色存在耗時、組織消耗大、圖像未對齊等問題。 虛擬染色技術可通過生成模型將H&E圖像轉換為IHC圖像,但現有方法面臨兩大挑戰: ?染色不真實性?:生成圖像與真實IHC的分布存在…