Qt中實現工廠模式

在Qt中實現工廠模式可以通過多種方式,具體選擇取決于需求和場景。以下是幾種常見的實現方法:

1. 簡單工廠模式通過一個工廠類根據參數創建不同對象。cppclass Shape {public: virtual void draw() = 0; virtual ~Shape() = default;};class Circle : public Shape {public: void draw() override { qDebug() << "Drawing Circle"; }};class Rectangle : public Shape {public: void draw() override { qDebug() << "Drawing Rectangle"; }};class ShapeFactory {public: static Shape* createShape(const QString& type) { if (type == "Circle") return new Circle(); if (type == "Rectangle") return new Rectangle(); return nullptr; }};// 使用Shape* circle = ShapeFactory::createShape("Circle");circle->draw(); // 輸出: Drawing Circle### 2. **動態注冊工廠(擴展性好)**使用注冊表動態注冊創建函數,支持擴展。cppclass ShapeFactory {public: using Creator = std::function<Shape*()>; static void registerCreator(const QString& type, Creator creator) { creators()[type] = creator; } static Shape* create(const QString& type) { auto it = creators().find(type); return (it != creators().end()) ? it->second() : nullptr; }private: static QMap<QString, Creator>& creators() { static QMap<QString, Creator> instance; return instance; }};// 注冊具體類struct CircleRegistrar { CircleRegistrar() { ShapeFactory::registerCreator("Circle", []{ return new Circle; }); }} static circleRegistrar;// 使用Shape* shape = ShapeFactory::create("Circle");### 3. **利用Qt元對象系統(QObject派生類)**通過類名動態創建對象,需配合Qt的元對象系統。cppclass Shape : public QObject { Q_OBJECTpublic: virtual void draw() = 0;};class Circle : public Shape { Q_OBJECTpublic: void draw() override { qDebug() << "Circle"; }};// 注冊元類型Q_DECLARE_METATYPE(Circle*)qRegisterMetaType<Circle*>();// 使用類名創建實例const QMetaObject* meta = QMetaType::metaObjectForType(QMetaType::type("Circle"));Shape* obj = qobject_cast<Shape*>(meta->newInstance());### 4. Qt插件系統結合工廠模式動態加載插件并創建實例,適合擴展應用。接口定義 (shapeplugin.h):cpp#include <QtPlugin>class Shape {public: virtual void draw() = 0; virtual ~Shape() = default;};#define ShapeInterface_iid "com.example.ShapeInterface"Q_DECLARE_INTERFACE(Shape, ShapeInterface_iid)插件實現 (circleplugin.cpp):cppclass CirclePlugin : public QObject, public Shape { Q_OBJECT Q_PLUGIN_METADATA(IID ShapeInterface_iid FILE "circle.json") Q_INTERFACES(Shape)public: void draw() override { qDebug() << "Circle Plugin"; }};#include "circleplugin.moc"加載插件:cppQPluginLoader loader("circleplugin.dll");QObject* plugin = loader.instance();if (plugin) { Shape* shape = qobject_cast<Shape*>(plugin); shape->draw(); // 輸出: Circle Plugin}### 總結- 簡單工廠:適用于類型較少且不常變化的場景。- 動態注冊:擴展性好,新增類型無需修改工廠。- 元對象系統:適合QObject派生類,利用Qt的反射機制。- 插件系統:實現動態擴展,適用于模塊化設計。根據具體需求選擇合適的方式,確保代碼的靈活性和可維護性。

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

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

相關文章

【前端】ES6一本通_劃重點_補充面試題

近兩天更新完基本內容&#xff0c;后續長期更新&#xff0c;建議關注收藏點贊。 ES6&#xff08;ECMAScript 2015&#xff09;是現代 JavaScript 的基礎&#xff0c;在前端面試中非常常見。 本文已匯總的本站筆記 ES6最重要10特性 對象新增 數組新增 異步、生成器 Promise 模塊…

初識 iOS 開發中的證書固定

引言 在移動應用安全領域&#xff0c;HTTPS/TLS 是數據傳輸的第一道防線&#xff0c;但僅依賴系統默認的證書驗證仍有被中間人&#xff08;MITM&#xff09;攻擊的風險。Certificate Pinning&#xff08;證書固定&#xff09;通過將客戶端信任“釘”在指定的服務器證書或公鑰上…

單片機的各個種類及其詳細介紹

一、按架構分類的深度解析 1. ARM Cortex-M系列 核心優勢&#xff1a; 統一架構&#xff1a;ARM生態完善&#xff0c;工具鏈&#xff08;Keil、IAR、GCC&#xff09;通用。 性能分層&#xff1a;M0&#xff08;低功耗&#xff09;、M3&#xff08;平衡&#xff09;、M4/M7&am…

5.7/Q1,GBD數據庫最新文章解讀

文章題目&#xff1a;Global, regional, and national burden and trends of rheumatoid arthritis among the elderly population: an analysis based on the 2021 Global Burden of Disease study DOI&#xff1a;10.3389/fimmu.2025.1547763 中文標題&#xff1a;全球、區域…

從微服務到AI服務:Nacos 3.0如何重構下一代動態治理體系?

在現代微服務架構的浪潮中&#xff0c;Nacos早已成為開發者手中的“瑞士軍刀”。作為阿里巴巴開源的核心中間件&#xff0c;它通過動態服務發現、統一配置管理和服務治理能力&#xff0c;為云原生應用提供了堅實的基石。從初創公司到全球500強企業&#xff0c;Nacos憑借其開箱即…

Unity與Unreal Engine(UE)的深度解析及高級用法

以下是Unity與Unreal Engine(UE)的深度解析及高級用法對比,結合技術特性、行業應用與未來發展進行綜合闡述: 一、核心差異與適用場景對比 1. 技術架構與編程模式 Unity 語言與腳本:主要使用C#,語法簡潔且易于學習,適合快速原型開發和中小型項目。支持可視化腳本工具(如…

李沐動手深度學習(pycharm中運行筆記)——05.線性代數

05.線性代數&#xff08;與課程對應&#xff09; 1、導入torch import torch2、 標量由只有一個元素的張量表示 x torch.tensor([3.0]) y torch.tensor([2.0]) print("x y:", x y, "\nx * y:", x * y, "\nx / y:", x / y, "\nx ** y…

Python3與Dubbo3.1通訊解決方案(dubbo-python)

【文章非VIP可讀&#xff0c;如果發現閱讀限制為系統自動修改閱讀權限&#xff0c;請留言我改回】 概述 最近AI項目需要java與python通訊&#xff0c;兩邊都是比較新的版本。因此需要雙方進行通訊&#xff0c;在這里記錄一下所采用的方案和關鍵點。 JAVA調用Python python通…

使用 DBeaver 將數據從 PostgreSQL 導出到 SQLite

使用 DBeaver 將數據從 PostgreSQL 導出到 SQLite&#xff0c;可按以下步驟進行&#xff1a; 1、連接到 PostgreSQL 數據庫&#xff1a;打開 DBeaver&#xff0c;點擊 “新建連接”&#xff0c;選擇 “PostgreSQL”&#xff0c;輸入數據庫的地址、端口、用戶名和密碼等信息&am…

介詞:連接名詞與句子其他成分的橋梁

文章目錄 1. with伴隨1.表示“跟人或物”的伴隨2.“行為”和“狀態”的伴隨2. of所屬關系1. 人或物的所屬關系2. 比較抽象的所屬關系3. in1. 在......中,在......范圍里2. 在某一段時間4. on1. 表示地點:在......上2. 表示時間:在某一天3. 關于某個主題5. at1. at + 具體時間…

FastApi快速實踐

文章目錄 一、主要功能&#xff1a;二、安裝 FastAPI 和 Uvicorn&#xff08;運行服務器&#xff09;三、示例代碼&#xff1a;四、運行服務器&#xff1a;1. 方式一&#xff1a;2. 方式二&#xff1a; 五、訪問接口六、如果需要跨域&#xff08;CORS&#xff09;七、總結 下面…

深度學習中保存最優模型的實踐與探索:以食物圖像分類為例

深度學習中保存最優模型的實踐與探索&#xff1a;以食物圖像分類為例 在深度學習的模型訓練過程中&#xff0c;訓練一個性能良好的模型往往需要耗費大量的時間和計算資源。而保存最優模型不僅可以避免重復訓練&#xff0c;還能方便后續使用和部署。本文將結合食物圖像分類的代…

護理崗位技能比賽主持稿串詞

男&#xff1a;尊敬的各位老師 女&#xff1a;親愛的各位同學 合&#xff1a;大家下午好。 男&#xff1a;在這鳥語花香&#xff0c;詩意盎然的季節里 女&#xff1a;在這陽光燦爛&#xff0c;激情似火的日子里 合&#xff1a;我們歡聚一堂&#xff0c;共同慶祝五一二國際護士節…

【翻譯、轉載】MCP 核心架構

核心架構 了解 MCP 如何連接客戶端、服務器和 LLM 模型上下文協議 (MCP) 構建在一個靈活、可擴展的架構之上&#xff0c;能夠實現 LLM 應用程序與集成之間的無縫通信。本文檔涵蓋了核心的架構組件和概念。 概述 MCP 遵循客戶端-服務器 (client-server) 架構&#xff0c;其中…

Python 數據智能實戰 (11):LLM如何解決模型可解釋性

寫在前面 —— 不只知其然,更要知其所以然:借助 LLM,揭開復雜模型決策的神秘面紗 在前面的篇章中,我們學習了如何利用 LLM 賦能用戶分群、購物籃分析、流失預測以及個性化內容生成。我們看到了 LLM 在理解數據、生成特征、提升模型效果和自動化內容方面的巨大潛力。 然而…

Linux:進程優先級及環境

一&#xff1a;孤兒進程 在Linux系統中&#xff0c;當一個進程創建了子進程后&#xff0c;如果父進程執行完畢或者提前退出而子進程還在運行&#xff0c;那么子進程就會成為孤兒進程。子進程就會被systemd&#xff08;系統&#xff09;進程收養&#xff0c;其pid為1 myproces…

Java大廠面試:Java技術棧中的核心知識點

Java技術棧中的核心知識點 第一輪提問&#xff1a;基礎概念與原理 技術總監&#xff1a;鄭薪苦&#xff0c;你對JVM內存模型了解多少&#xff1f;能簡單說說嗎&#xff1f;鄭薪苦&#xff1a;嗯……我記得JVM有堆、棧、方法區這些區域&#xff0c;堆是存放對象的地方&#xf…

CF1000E We Need More Bosses

CF1000E We Need More Bosses 題目描述 題目大意&#xff1a; 給定一個 n n n 個點 m m m 條邊的無向圖&#xff0c;保證圖連通。找到兩個點 s , t s,t s,t&#xff0c;使得 s s s到 t t t必須經過的邊最多&#xff08;一條邊無論走哪條路線都經過ta&#xff0c;這條邊就是…

imx6uLL應用-v4l2

Linux V4L2 視頻采集 JPEG 解碼 LCD 顯示實踐 本文記錄一個完整的嵌入式視頻處理項目&#xff1a;使用 V4L2 接口從攝像頭采集 MJPEG 圖像&#xff0c;使用 libjpeg 解碼為 RGB 格式&#xff0c;并通過 framebuffer 顯示在 LCD 屏幕上。適用于使用 ARM Cortex-A 系列開發板進…

強化學習機器人模擬器——QAgent:一個支持多種強化學習算法的 Python 實現

QAgent 是一個靈活的 Python 類,專為實現經典的強化學習(Reinforcement Learning, RL)算法而設計,支持 Q-learning、SARSA 和 SARSA(λ) 三種算法。本篇博客將基于提供的 q_agent.py 代碼,詳細介紹 QAgent 類的功能、結構和使用方法,幫助您理解其在強化學習任務中的應用,…