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设计模式:单例模式

相关推荐

  1. QT设计模式工厂模式

    2024-05-09 19:06:03       11 阅读
  2. QT设计模式:抽象工厂模式

    2024-05-09 19:06:03       15 阅读
  3. QT设计模式模板模式

    2024-05-09 19:06:03       9 阅读
  4. 设计模式工厂模式

    2024-05-09 19:06:03       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-09 19:06:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-09 19:06:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-09 19:06:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-09 19:06:03       20 阅读

热门阅读

  1. websocket简介

    2024-05-09 19:06:03       9 阅读
  2. 从零手写实现 tomcat-03-基本的 socket 实现

    2024-05-09 19:06:03       13 阅读
  3. 【论文创新】如何寻找自己论文的创新点?

    2024-05-09 19:06:03       10 阅读
  4. 以下是服务器的一些主要作用:

    2024-05-09 19:06:03       9 阅读
  5. Vue Router

    2024-05-09 19:06:03       10 阅读
  6. Flink面试整理-Flink是什么?

    2024-05-09 19:06:03       11 阅读
  7. 封装长按触发事件的uniapp组件

    2024-05-09 19:06:03       10 阅读
  8. Flask 路由基础和封装

    2024-05-09 19:06:03       9 阅读