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.mzph.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 类的功能、结构和使用方法,帮助您理解其在强化学习任务中的应用,…