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

QT设计模式:工厂模式

基本概念

工厂模式是一种创建型设计模式,用于将对象的创建逻辑与使用者分离,以实现对象的创建和使用的解耦。工厂模式提供了一个统一的接口来创建对象,而客户端代码只需通过该接口来请求所需的对象,而不需要知道具体的对象创建细节。

工厂模式的各种部件为:

  • 工厂(Factory):实现了工厂接口,负责创建具体产品的对象。
  • 产品(Product):工厂方法创建的具体实例对象。

使用场景

  • 对象创建逻辑复杂,可能涉及到配置解析、条件判断等逻辑时。

  • 对象类型不明确,对象的具体类型可能在运行时才能确定,例如根据用户的输入或配置来决定创建哪种对象时。

  • 需要隐藏对象创建细节,只暴露一个统一的接口给客户端使用时。

  • 需要扩展对象创建,如果需要向系统中添加新的产品类,而不影响现有代码时。

  • 需要创建的对象具有共同的接口时。                                                                                                                                                                                                            

实现

例子

假设我们有一个形状(Shape)的抽象基类,以及两个具体的形状类:圆形(Circle)和矩形(Rectangle)。创建一个形状工厂(ShapeFactory):

// 抽象基类 Shape
class Shape {
public:virtual void draw() = 0;virtual ~Shape() {}
};// 具体类 Circle
class Circle : public Shape {
public:void draw() override {std::cout << "Drawing Circle" << std::endl;}
};// 具体类 Rectangle
class Rectangle : public Shape {
public:void draw() override {std::cout << "Drawing Rectangle" << std::endl;}
};// 形状工厂类 ShapeFactory
class ShapeFactory {
public:// 根据类型创建相应的形状对象static Shape* createShape(const std::string& type) {if (type == "Circle") {return new Circle();} else if (type == "Rectangle") {return new Rectangle();}return nullptr;}
};int main() {// 使用工厂创建不同类型的形状对象Shape* circle = ShapeFactory::createShape("Circle");Shape* rectangle = ShapeFactory::createShape("Rectangle");return 0;
}

QObject 工厂

继承了QObject的类,可以通过 Q_INVOKABLE 和 QMetaObject::newInstance 来实现工厂模式,需要把产品类的构造函数声明为Q_INVOKABLE,并调用QObject::staticMetaObject.newInstance()函数。


class Product : public QObject
{Q_OBJECT
public:Q_INVOKABLE explicit Product(QObject *parent = nullptr);
};int main(){QObject *object= Product::staticMetaObject.newInstance();}

单例模式

单例模式也可以看成是工厂模式的一种实现,其隐藏了创建对象的细节,确保在程序中类只有一个实例。

QT设计模式:单例模式

http://www.lryc.cn/news/343784.html

相关文章:

  • 【电路笔记】-容抗
  • 基于若依框架搭建网站的开发日志(一):若依框架搭建、启动、部署
  • Android中Fragment失去焦点的场景
  • Linux变量的认识及环境变量配置详解
  • 【excel】数据非数值导致排序失效
  • 软件网关--Nginx
  • sourceTree push失败
  • leetCode33. 搜索旋转排序数组
  • JS_监听dom变化触发,new MutationObserver
  • 什么是驱动数字签名?如何获取驱动数字签名?
  • 【leetcode】优先队列题目总结
  • typescript 中的泛型
  • 计算方法实验2(补充):列主元消元法解线性方程组
  • Qt扫盲-Qt D-Bus概述
  • 懒洋洋作业讲解
  • vue3 + ts实现canvas绘制的waterfall
  • 代码随想录算法训练营第四十四天
  • 【3dmax笔记】027:配置修改器集、工具栏自定义与加载
  • Reactor模型详解
  • 内存卡罢工,数据危机?别急,有救!
  • python爬虫实战
  • k8s 资源文件参数介绍
  • mac系统安装steam报错-解决办法
  • 这个簇状柱形图怎么添加百分比?
  • Tomact安装配置及使用(超详细)
  • web后端——netbeans ide +jsp+servlet开发学习总结
  • 使用request-try-notifyState流程实现UI控制与状态反馈的完整闭环
  • 屏蔽罩材质和厚度对屏蔽效能的影响
  • Qt简单离线音乐播放器
  • 微信小程序常用的api