当前位置: 首页 > news >正文

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.xdnf.cn/news/263395.html

相关文章:

  • 音视频开源项目列表
  • 【2025年】MySQL面试题总结
  • 实战探讨:为什么 Redis Zset 选择跳表?
  • xLua笔记
  • 55.[前端开发-前端工程化]Day02-包管理工具npm等
  • Oracle 11g通过dg4odbc配置dblink连接神通数据库
  • Oracle RAC ‘Metrics Global Cache Blocks Lost‘告警解决处理
  • 小程序滚动条隐藏(uniapp版本)
  • 【Java学习】通配符?
  • Java多语言DApp质押挖矿盗U源码(前端UniApp纯源码+后端Java)
  • 使用 Selenium 爬取动态网页数据 —— 实战与坑点详解
  • 基于LangChain 实现 Advanced RAG-后检索优化(下)-上下文压缩与过滤
  • 将Airtable导入NocoDB
  • 多协议 Tracker 系统架构与传感融合实战 第六章 多传感器时钟同步与数据对齐
  • SETNX的存在问题和redisson进行改进的原理
  • 【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means
  • 【Hive入门】Hive与Spark SQL深度集成:执行引擎性能全面对比与调优分析
  • C语言蓝桥杯真题代码
  • Go反射-通过反射调用结构体的方法(带入参)
  • 解决奥壹oelove婚恋原生小程序上架问题,彻底解决解对问题增强版旗舰版通用
  • 计算机网络八股文--day4 --传输层TCP与UDP
  • WebAPI项目从Newtonsoft.Json迁移到System.Text.Json踩坑备忘
  • 【项目实践】boost 搜索引擎
  • 基于 JSP 和 Servlet 的数字信息分析小应用
  • 【Linux】驱动开发方法
  • ES6/ES11知识点 续一
  • 人工智能发展史 — 物理学诺奖之 Hopfield 联想和记忆神经网络模型
  • 19:常见的Halcon数据格式
  • 优化01-统计信息
  • 深入解析 SqlSugar 与泛型封装:实现通用数据访问层