使用C++11改進工廠方法模式:支持運行時配置的增強實現

在軟件開發中,工廠方法模式是一種常用的設計模式,用于創建對象。通過使用C++11的新特性,我們可以進一步改進工廠方法模式,使其更加靈活和高效。本文將詳細介紹如何使用C++11的std::function、lambda表達式和智能指針來實現一個支持運行時配置的工廠方法模式,以創建不同類型的“勇勇”角色。

1. 核心概念

工廠方法模式:通過定義一個用于創建對象的接口,讓子類決定實例化哪一個類。這樣,工廠方法將對象的創建推遲到子類中。

C++11特性

  • std::function :一個通用的多態函數包裝器,可以存儲、復制和調用任何可調用目標。
  • Lambda表達式:提供了一種簡潔的方式來定義匿名函數。
  • 智能指針:如std::unique_ptr,用于自動管理動態內存,避免內存泄漏。

2. 實現思路

我們的目標是創建一個支持運行時動態配置的工廠方法模式。具體來說,我們希望能夠在程序運行時注冊不同的勇勇類型創建函數,并根據需要動態地創建相應類型的勇勇實例。

3. 代碼實現

#include <map>
#include <functional>
#include <memory>
#include <string>
#include <stdexcept>
#include <iostream>// 定義勇勇類型枚舉
enum class YongYongType { Common, Advanced };// 定義勇勇接口
class YongYong {
public:virtual ~YongYong() = default;virtual void attack() const = 0;virtual void defense() const = 0;
};// 具體的勇勇實現類
class CommonYongYong : public YongYong {
public:void attack() const override {std::cout << "普通勇勇發起普通攻擊。" << std::endl;}void defense() const override {std::cout << "普通勇勇進行普通防御。" << std::endl;}
};class AdvancedYongYong : public YongYong {
public:void attack() const override {std::cout << "高級勇勇發起強力攻擊。" << std::endl;}void defense() const override {std::cout << "高級勇勇進行高級防御。" << std::endl;}
};// 工廠類
class GuoYaoFactory {
public:using CreatorFunc = std::function<std::unique_ptr<YongYong>()>;static void registerCreator(YongYongType type, CreatorFunc creator) {getRegistry()[type] = creator;}static std::unique_ptr<YongYong> create(YongYongType type) {auto it = getRegistry().find(type);if (it != getRegistry().end()) {return it->second();}throw std::invalid_argument("Unknown YongYong type");}private:static std::map<YongYongType, CreatorFunc>& getRegistry() {static std::map<YongYongType, CreatorFunc> registry;return registry;}
};// 初始化工廠注冊表
void initGuoYaoFactory() {GuoYaoFactory::registerCreator(YongYongType::Common, []() {return std::make_unique<CommonYongYong>();});GuoYaoFactory::registerCreator(YongYongType::Advanced, []() {return std::make_unique<AdvancedYongYong>();});
}int main() {initGuoYaoFactory();// 創建不同類型的勇勇對象auto commonYongYong = GuoYaoFactory::create(YongYongType::Common);commonYongYong->attack();commonYongYong->defense();auto advancedYongYong = GuoYaoFactory::create(YongYongType::Advanced);advancedYongYong->attack();advancedYongYong->defense();return 0;
}

4. 代碼解釋

  1. 枚舉類型YongYongType

    • 定義了兩種勇勇類型:Common(普通勇勇)和Advanced(高級勇勇)。
  2. 接口YongYong

    • 定義了勇勇類的接口,包含兩個純虛函數attackdefense,分別表示攻擊和防御行為。
  3. 具體勇勇實現類

    • CommonYongYong實現了普通勇勇的攻擊和防御行為,輸出相應的信息。
    • AdvancedYongYong實現了高級勇勇的攻擊和防御行為,輸出相應的信息。
  4. 工廠類GuoYaoFactory

    • 使用std::function定義了創建函數的類型CreatorFunc
    • registerCreator方法用于注冊具體的勇勇類型創建函數。
    • create方法根據給定的勇勇類型查找并調用對應的創建函數,返回勇勇對象的唯一指針。
    • getRegistry方法返回一個靜態的std::map,用于存儲勇勇類型的創建函數映射。
  5. 初始化函數initGuoYaoFactory

    • 在程序啟動時調用,注冊所有已知的勇勇類型的創建函數。這里使用了lambda表達式來簡化創建函數的定義。
  6. main函數

    • 初始化工廠注冊表。
    • 使用工廠類創建不同類型的勇勇對象,并調用它們的攻擊和防御方法,以展示工廠方法模式的效果。

5. 優點

  • 動態擴展:通過注冊表機制,可以在運行時動態地添加新的勇勇類型,而無需修改工廠類的代碼。
  • 簡潔性:使用lambda表達式和std::function簡化了創建函數的定義和管理。
  • 內存安全:使用std::unique_ptr管理對象的生命周期,避免了手動內存管理帶來的潛在問題。
  • 靈活性:支持多種創建方式,可以根據需求靈活地選擇不同的創建函數。

6. 總結

通過使用C++11的特性,我們可以顯著改進工廠方法模式的實現。std::function和lambda表達式使得創建函數的定義更加簡潔和靈活,而智能指針則確保了內存的安全管理。此外,通過靜態注冊表的設計,我們實現了運行時動態配置的能力,使系統更加靈活和可擴展。這種改進不僅提高了代碼的可讀性和維護性,還為系統的未來發展預留了充足的空間。通過這種方式,我們可以設計出更加靈活和可擴展的系統,從而更好地應對需求的變化和擴展。

Horse3D游戲引擎研發筆記(一):從使用Qt的OpenGL庫繪制三角形開始
Horse3D游戲引擎研發筆記(二):基于QtOpenGL使用仿Three.js的BufferAttribute結構重構三角形繪制
Horse3D游戲引擎研發筆記(三):使用QtOpenGL的Shader編程繪制彩色三角形
Horse3D游戲引擎研發筆記(四):在QtOpenGL下仿three.js,封裝EBO繪制四邊形
Horse3D游戲引擎研發筆記(五):在QtOpenGL環境下,仿three.js的BufferGeometry管理VAO和EBO繪制四邊形
Horse3D游戲引擎研發筆記(六):在QtOpenGL環境下,仿Unity的材質管理Shader繪制四邊形
Horse3D游戲引擎研發筆記(七):在QtOpenGL環境下,使用改進的Uniform變量管理方式繪制多彩四邊形 (相較于Unity、Unreal Engine與Godot引擎)

Pomian語言處理器 研發筆記(一):使用C++的正則表達式構建詞法分析器

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

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

相關文章

小程序插件使用

插件介紹 插件是對一組 js 接口、自定義組件 或頁面的封裝&#xff0c;用于嵌入到小程序中使用。插件不能獨立運行&#xff0c;必須嵌入在其他小程序中才能被用戶使用&#xff1b;而第三方小程序在使用插件時&#xff0c;也無法看到插件的代碼。因此&#xff0c;插件適合用來封…

要區分一張圖片中的網狀圖(如網格結構或規則紋理)和噪點(隨機分布的干擾像素),比如電路的方法 計算機視覺

要區分一張圖片中的網狀圖&#xff08;如網格結構或規則紋理&#xff09;和噪點&#xff08;隨機分布的干擾像素&#xff09;&#xff0c;需結合圖像預處理、特征提取和分割算法。以下是系統化的解決方案&#xff0c;分階段說明關鍵技術和算法選擇&#xff1a; &#x1f50d; 一…

06_并發編程高級特性

第6課:并發編程高級特性 課程目標 掌握context包的使用 理解sync包中的同步原語 學會處理并發安全問題 掌握性能優化技巧 1. Context包 1.1 Context基礎 import ("context""fmt""time" )// 基本Context使用 func basicContext()

X00238-非GNSS無人機RGB圖像衛星圖像視覺定位python

獲取方式見文末&#xff0c;可開發票隨著無人機在工業和科研領域應用的加速發展&#xff0c;在非城市環境中使用無gnss、基于視覺的方法進行無人機定位的需求日益增長。本文提出了一種基于視覺的定位算法&#xff0c;利用深度特征計算無人機在野外飛行的地理坐標。該方法基于匹…

Eino 開源框架全景解析 - 以“大模型應用的搭積木指南”方式理解

Eino 開源框架全景解析 - 大模型應用的搭積木指南 &#x1f3af; 什么是 Eino&#xff1f;一句話概括 Eino 是字節跳動開源的大語言模型應用開發框架&#xff0c;就像是一個專門為 AI 應用設計的"搭積木工具箱"&#xff0c;讓開發者能夠像搭樂高一樣輕松構建復雜的 A…

嵌入式開發中,usb通信中輸出端點和輸入端點

一. 簡介本文簡單學習一下&#xff0c;嵌入式開發中&#xff0c;usb的輸出端點和輸入端點。在嵌入式開發的 USB 通信場景中&#xff0c;輸出端點&#xff08;OUT Endpoint&#xff09; 和 輸入端點&#xff08;IN Endpoint&#xff09; 是 USB 設備與主機&#xff08;如電腦、嵌…

【自用】Maven常用依賴

【自用】Maven常用依賴 工具類 Guava Guava&#xff08;Google Guava&#xff09;是由Google團隊開發的一套Java開源工具庫&#xff0c;旨在簡化和增強Java開發者的日常工作。它提供了許多實用的工具和基礎設施&#xff0c;覆蓋了集合、并發、字符串處理、I/O、數學運算等多個…

Java 18 新特性及具體應用

目錄 1. UTF-8 默認編碼 (JEP 400) 2. 簡單 Web 服務器 (JEP 408) 3. Javadoc 代碼片段 (JEP 413) 4. switch 模式匹配 (JEP 420, 第二次預覽) 5. 向量 API (JEP 417, 第三次孵化) 總結 Java 18 于 2022 年 3 月發布&#xff0c;引入了多項新特性&#xff0c;旨在提升開發…

unistd.h 常用函數速查表

在這篇文章中&#xff0c;我們將整理一份 unistd.h 常用函數速查表&#xff0c;便于快速查找和記憶&#xff0c;涵蓋文件 I/O、進程管理、系統信息、用戶/組信息等方面。unistd.h 常用函數速查表&#xff08;POSIX/Linux/macOS&#xff09; 1. 文件與 I/O 操作函數說明示例int …

【電子通識】芯片生產考驗“三重門”之CP、FT與WAT測試

在我們日常生活中&#xff0c;從手機、電腦到汽車、家電&#xff0c;都離不開一顆顆小小的芯片。你可曾想過&#xff0c;這些功能強大的芯片在出廠前要經過怎樣嚴苛的“體檢”才能保證質量可靠&#xff1f;今天&#xff0c;我們就來聊聊芯片制造過程中三道至關重要的測試關卡&a…

Java RESTful API 構建從入門到精通:一步步打造高效后端服務

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 在當今數字化時代,RESTful API 已成為現代Web應用的核心組成部分,它提供了一種標準化、靈活的方式來實現前后端分離和跨平臺數據交互。本文作為一篇完整的指南,將從基礎概念入手,詳細闡述…

TypeScript 接口(interface)

一、接口基礎概念接口&#xff08;interface&#xff09;是 TypeScript 的核心類型系統工具&#xff0c;用于定義對象的結構規范。它不關心具體實現細節&#xff0c;只強制要求符合接口定義的對象必須包含指定屬性和方法。例如&#xff1a;interface Person {name: string;age:…

selenium3.141.0執行JS無法傳遞element解決方法

問題&#xff1a;在Chrome 131版本以下執行下面代碼沒有問題&#xff0c;但是在131版本以上出現element無法傳遞問題&#xff0c;執行下面代碼會出現 "Message: javascript error: Cannot read properties of undefined (reading click)"# xpath匹配元素&#xff0c;…

汽車主機廠為何開始押注平臺化視覺?

近年來&#xff0c;隨著智能制造、出口質量標準、新能源整車結構復雜度等多重因素疊加&#xff0c;越來越多主機廠開始從“點狀部署”轉向“系統化導入”&#xff0c;平臺化的AI視覺檢測體系正逐步成為整車廠的標準化選項。在過去&#xff0c;汽車制造四大車間——焊裝、涂裝、…

STM32 - Embedded IDE - GCC - 重定向printf到串口

導言如上所示&#xff0c;在不同的編譯器下&#xff0c;重定向printf到串口時&#xff0c;使用的函數不一樣。 ARMCC&#xff08;Keil-MDK&#xff09;使用fputc()GCC使用_write() 總之&#xff0c;GCC/newlib的printf()走_write()&#xff0c;不是fputc()。

51單片機-中斷系統

本質概述思維導圖&#xff1a;51單片機中斷系統中斷系統概述中斷系統是為使CPU具有對外界緊急事件的實時處理能力而設置的。當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求&#xff0c;要求CPU暫停當前的工作&#xff0c;轉而去處理這個緊急事件&#xff0c;處理完…

ubuntu - 終端工具 KConsole安裝

地址&#xff1a; https://konsole.kde.org/download.html 直接使用自帶安裝管理器安裝即可

QT-左右側邊欄動畫

QT-左右側邊欄動畫演示效果一、核心程序二、鏈接演示效果 一、核心程序 #ifndef SLIDEPANEL_H #define SLIDEPANEL_H#include <QWidget> #include <QPropertyAnimation> #include <QPushButton> #include <QVBoxLayout>class SlidePanel : public QWi…

WebRTC 結合云手機:釋放實時通信與虛擬手機的強大協同效能

開發一個基于 WebRTC 技術的云手機群控系統&#xff0c;實現通過瀏覽器遠程控制多臺云手機&#xff0c;并提供文件管理、代理管理、備份管理等功能。這里只詳細分享 WebRTC 技術。 https://github.com/LingyuCoder?tabrepositories&qsky&type&language&sort …

Kafka中zk的作用是什么

Zookeeper是分布式協調&#xff0c;注意它不是數據庫 kafka中使用了zookeeper的分布式鎖和分布式配置及統一命名的分布式協調解決方案 在kafka的broker集群中的controller的選擇&#xff0c;是通過zk的臨時節點爭搶獲得的 brokerID等如果自增的話也是通過zk的節點version實現的…