QT设计模式:工厂模式

ops/2024/10/18 0:18:30/

基本概念

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

工厂模式的各种部件为:

  • 工厂(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.ppmy.cn/ops/38013.html

相关文章

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

uni-app 从vue3项目创建到Pinia管理数据全局使用 持久化存储数据 详细教程

一、创建uni-app项目 1. 安装HBuilder X&#xff0c;下载地址&#xff1a;https://www.dcloud.io/hbuilderx.html 2. 打开HBuilder X&#xff0c;点击左上角的“文件”->“新建”->“项目”&#xff0c;选择“uni-app”项目模板&#xff0c;填写项目名称和项目路径&…

配电室智能巡检机器人

近年来&#xff0c;生产过程高度自动化&#xff0c;各工矿企业关键场所需定期巡检维护。但目前巡检主要靠人工&#xff0c;既耗时费力效率又低&#xff0c;且受环境等因素影响&#xff0c;巡检难以全面规范&#xff0c;隐患或问题易被忽视。在此情况下&#xff0c;如何利用现有…

(类)偏特化Partial Specialization

当编写一个模板特化&#xff0c;涉及部分但不是全部模板参数时&#xff0c;它被称为偏特化&#xff08;Partial Specialization&#xff09;。【注意&#xff0c;偏特化是针对类模板而言&#xff0c;函数模板不可偏特化&#xff0c;只能全特化】 偏特化是C模板编程中的一种技术…

基于Springboot的教学资源共享平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的教学资源共享平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【Linux】gcc/g++的使用

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中gcc/g使用的相关内容。 如果看到最后您觉得这篇文章写得不错…

[前端异步]循环中所有异步任务完成才往下运行?

reqData(){this.startLoading();//获取分析结果数据for (let i 1; i <24;i 1) {try {let formattedValue i.toString().padStart(4, 0);this.requestData(formattedValue).then((PromiseResult) > {if(PromiseResult.status"success"){this.images.push(Pro…

idea 项目 修改项目文件名 教程

文章目录 目录 文章目录 修改流程 小结 概要流程技术细节小结 概要 原项目名 修改流程 关掉当前项目的idea页面 修改之后的文件名 重新打开idea。选择项目打开项目页面 技术细节 出现下面这个问题&#xff0c;可以参考作者新的一编文章idea开发工具 项目使用Spring框架开发解…