在軟件開發中,工廠方法模式是一種常用的設計模式,用于創建對象。通過使用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. 代碼解釋
-
枚舉類型YongYongType:
- 定義了兩種勇勇類型:Common(普通勇勇)和Advanced(高級勇勇)。
-
接口YongYong:
- 定義了勇勇類的接口,包含兩個純虛函數
attack
和defense
,分別表示攻擊和防御行為。
- 定義了勇勇類的接口,包含兩個純虛函數
-
具體勇勇實現類:
CommonYongYong
實現了普通勇勇的攻擊和防御行為,輸出相應的信息。AdvancedYongYong
實現了高級勇勇的攻擊和防御行為,輸出相應的信息。
-
工廠類GuoYaoFactory:
- 使用
std::function
定義了創建函數的類型CreatorFunc
。 registerCreator
方法用于注冊具體的勇勇類型創建函數。create
方法根據給定的勇勇類型查找并調用對應的創建函數,返回勇勇對象的唯一指針。getRegistry
方法返回一個靜態的std::map
,用于存儲勇勇類型的創建函數映射。
- 使用
-
初始化函數initGuoYaoFactory:
- 在程序啟動時調用,注冊所有已知的勇勇類型的創建函數。這里使用了lambda表達式來簡化創建函數的定義。
-
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++的正則表達式構建詞法分析器