回調函數和工廠模式

回調函數和工廠模式可以結合使用,以實現靈活的對象創建和動態行為。這種結合通常用于需要根據特定條件創建對象并在對象上執行某些操作的場景。以下是如何將回調函數與工廠模式結合的示例和解釋。

結合使用的場景
動態對象創建:使用工廠模式創建不同類型的對象。
自定義行為:通過回調函數定義對象的特定行為或操作。
示例代碼
以下是一個結合回調函數和工廠模式的示例:

#include
#include
#include

// 產品接口
class Product {
public:
virtual void use() = 0;
};

// 具體產品
class ConcreteProductA : public Product {
public:
void use() override {
std::cout << “Using Product A” << std::endl;
}
};

class ConcreteProductB : public Product {
public:
void use() override {
std::cout << “Using Product B” << std::endl;
}
};

// 工廠
class Factory {
public:
static std::unique_ptr createProduct(char type) {
if (type == ‘A’) {
return std::make_unique();
} else if (type == ‘B’) {
return std::make_unique();
}
return nullptr;
}
};

// 客戶端代碼
void performAction(char productType, std::function<void(Product*)> callback) {
auto product = Factory::createProduct(productType);
if (product) {
callback(product.get()); // 調用回調函數
} else {
std::cout << “Invalid product type!” << std::endl;
}
}

int main() {
// 使用回調函數定義操作
performAction(‘A’, [](Product* p) {
p->use(); // 使用產品A
});

performAction(‘B’, [](Product* p) {
p->use(); // 使用產品B
});

return 0;
}
Copy
代碼解釋
產品接口和具體產品:
定義了一個 Product 接口和兩個具體實現 ConcreteProductA 和 ConcreteProductB。
工廠類:
Factory 類提供了靜態方法 createProduct,根據傳入的類型創建相應的產品對象。
回調函數:
performAction 函數接受一個產品類型和一個回調函數。它使用工廠模式創建產品,并在創建成功后調用回調函數。
客戶端代碼:
在 main 函數中,調用 performAction 并傳入不同的產品類型和相應的回調函數,以執行特定操作。
優點
靈活性:通過回調函數,客戶端可以定義如何使用創建的對象,而不需要修改工廠或產品的實現。
解耦:工廠模式和回調函數的結合使得對象創建和行為定義分離,增強了代碼的可維護性和可擴展性。

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

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

相關文章

find 查找文件grep匹配數據

一、find介紹 1. find . -iname "*.txt"查找當前目錄下各個文件夾下的txt屬性的文件(i忽略大小寫)。 2.find . -type f 查找當前目錄下各個文件夾下的文件 3.find . -type d 查找當前目錄下各個文件夾下的目錄 4.find . -type f | xargs grep -ain -E "匹配…

Mac上鴻蒙配置HDC報錯:zsh: command not found: hdc -v

這個問題困擾了好久&#xff0c;按照官方文檔去配置的&#xff0c;就是會一直報錯&#xff0c;沒有配置成功&#xff0c;主要原因是官網ide的路徑可能和你本地的ide的路徑不一致&#xff0c;因為官網的ide版本可能是最新的 一.先查找你本地的toolchains目錄在哪里&#xff0c;…

CS·GO搬磚流程詳細版

說簡單點&#xff0c;就是Steam買了然后BUFF上賣&#xff0c;或許大家都知道這點&#xff0c;但就是一些操作和細節問題沒那么明白。我相信&#xff0c;你看完這篇文章以后&#xff0c;至少會有新的認知。 好吧&#xff0c;廢話少說&#xff0c;直接上實操&#xff01; 首先準…

“深入淺出”系列之FFmpeg:(1)音視頻開發基礎

我的音視頻開發大部分內容是跟著雷霄驊大佬學習的&#xff0c;所以筆記也是跟雷老師的博客寫的。 一、音視頻相關的基礎知識 首先播放一個視頻文件的流程如下所示&#xff1a; FFmpeg的作用就是將H.264格式的數據轉換成YUV格式的數據&#xff0c;然后SDL將YUV顯示到電腦屏幕上…

【Linux】Linux開發:GDB調試器與Git版本控制工具指南

Linux相關知識點可以通過點擊以下鏈接進行學習一起加油&#xff01;初識指令指令進階權限管理yum包管理與vim編輯器GCC/G編譯器make與Makefile自動化構建 在 Linux 開發中&#xff0c;GDB 調試器和 Git 版本控制工具是開發者必備的利器。GDB 幫助快速定位代碼問題&#xff0c;G…

【設計模式-2】23 種設計模式的分類和功能

在軟件工程領域&#xff0c;設計模式是解決常見設計問題的經典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人幫&#xff0c;GoF&#xff09;在《設計模式&#xff1a;可復用面向對象軟件的基礎》一書中系統性地總結了…

谷粒商城-高級篇完結-Sleuth+Zipkin 服務鏈路追蹤

1、基本概念和整合 1.1、為什么用 微服務架構是一個分布式架構&#xff0c;它按業務劃分服務單元&#xff0c;一個分布式系統往往有很多個服務單元。由于服務單元數量眾多&#xff0c;業務的復雜性&#xff0c;如果出現了錯誤和異常&#xff0c;很難去定位 。主要體現在&#…

小米智能啞鈴上市,代理 IP 視角下的智能健身新篇

在智能科技與健康生活深度融合的時代&#xff0c;小米以其敏銳的市場洞察力和強大的創新能力&#xff0c;不斷拓展智能生態版圖。米家智能啞鈴的發布&#xff0c;無疑是其在智能健身領域的又一重要舉措。而當我們從代理 IP 的獨特視角來審視這一產品&#xff0c;會發現其中蘊含…

基于Python的音樂播放器 畢業設計-附源碼73733

摘 要 本項目基于Python開發了一款簡單而功能強大的音樂播放器。通過該音樂播放器&#xff0c;用戶可以輕松管理自己的音樂庫&#xff0c;播放喜愛的音樂&#xff0c;并享受音樂帶來的愉悅體驗。 首先&#xff0c;我們使用Python語言結合相關庫開發了這款音樂播放器。利用Tkin…

實際開發中,常見pdf|word|excel等文件的預覽和下載

實際開發中,常見pdf|word|excel等文件的預覽和下載 背景相關類型數據之間的轉換1、File轉Blob2、File轉ArrayBuffer3、Blob轉ArrayBuffer4、Blob轉File5、ArrayBuffer轉Blob6、ArrayBuffer轉File 根據Blob/File類型生成可預覽的Base64地址基于Blob類型的各種文件的下載各種類型…

微信小程序中的 storage(本地存儲)和內存是兩個完全不同的存儲區域

這是一個非常關鍵且容易混淆的概念 既然 this.globalData.appId appId 是將 appId 存儲在內存中&#xff0c;為什么微信小程序中的 wx.getStorage 和 wx.setStorage&#xff08;本地存儲&#xff09;中沒有 appId&#xff0c;并且您提出了一個非常重要的疑問&#xff1a;stor…

【C++數據結構——查找】二叉排序樹(頭歌實踐教學平臺習題)【合集】

目錄&#x1f60b; 任務描述 相關知識 1. 二叉排序樹的基本概念 2. 二叉排序樹節點結構體定義 3. 創建二叉排序樹 4. 判斷是否為二叉排序樹 5. 遞歸查找關鍵字為 6 的結點并輸出查找路徑 6. 刪除二叉排序樹中的節點 測試說明 通關代碼 測試結果 任務描述 本關任務&a…

計算機網絡(第8版)第3章課后習題--透明傳輸

【3-11】 試分別討論以下各種情況在什么條件下是透明傳輸&#xff0c;在什么條件下不是透明傳 輸。(提示&#xff1a;請弄清什么是“透明傳輸”,然后考慮能否滿足其條件。) (1)普通的電話通信。 (2)互聯網提供的電子郵件服務。 解 答 &#xff1a; 透明傳輸是指在數據傳輸…

Linux(17)——使用 DNF 安裝和更新軟件包

目錄 一、使用 DNF 管理軟件包&#xff1a; 1、 DNF 查找軟件&#xff1a; 2、DNF 安裝軟件&#xff1a; 3、DNF 刪除軟件&#xff1a; 二、使用 DNF 管理軟件包組&#xff1a; 1、DNF 顯示組信息&#xff1a; 2、DNF 安裝組&#xff1a; 三、使用 DNF 查看事務歷史記錄…

基于32單片機的智能語音家居

一、主要功能介紹 以STM32F103C8T6單片機為控制核心&#xff0c;設計一款智能遠程家電控制系統&#xff0c;該系統能實現如下功能&#xff1a; 1、可通過語音命令控制照明燈、空調、加熱器、窗戶及窗簾的開關&#xff1b; 2、可通過手機顯示和控制照明燈、空調、窗戶及窗簾的開…

Qt 5.14.2 學習記錄 —— ? 新項目

文章目錄 1、創建2、查看代碼 ---- main.cpp3、查看代碼 ---- widgt.h4、查看代碼 ---- widgt.cpp和widget.ui5、查看代碼 ---- Empty.pro6、運行產生的中間文件 1、創建 左上角的文件&#xff0c;新建文件或項目。如果要寫一個GUI程序&#xff0c;應當選擇Application&#x…

linux wsl配置 redis遠程連接

? 1. 修改 Redis 配置文件 在 WSL 的 Redis 配置文件中&#xff0c;找到 redis.conf 或 /etc/redis/redis.conf 文件&#xff0c;編輯以下配置項&#xff1a; ?? 更新 bind 配置項 將 bind 127.0.0.1 ::1 修改為&#xff1a; bind 0.0.0.0這樣&#xff0c;Redis 將監聽所…

Transformer從零詳細解讀——DASOU講AI

1. 從全局角度概括Transformer transformer的任務是什么&#xff1f; 進一步細化 進一步細化&#xff0c;注意&#xff1a;每個encoder結構相同&#xff0c;參數不同&#xff1b;decoder同理 原論文中的圖如下&#xff1a; 2.Encoder 2.1 輸入部分 &#xff08;1&#xff09…

ARM發布Armv9.5架構:邁向更強性能與靈活性的新時代

2024年11月30日&#xff0c;ARM正式發布了其最新的Armv9.5架構&#xff0c;這是Arm技術發展的又一重要里程碑。從表中信息來看&#xff0c;Armv9.5架構的發布標志著該公司的架構系列在性能、靈活性和可擴展性方面取得了進一步突破。本次發布不僅是技術上的提升&#xff0c;更是…

【Python運維】使用Python與Docker進行高效的容器化應用管理

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著容器化技術的廣泛應用,Docker已成為現代軟件開發與運維中不可或缺的工具。Docker容器提供了一種輕量級、可移植的方式來部署和管理應用…