QT设计模式:建造者模式

基本概念

建造者模式是一种创建型设计模式,它允许你创建复杂对象的过程独立于该对象的组成部分以及它们的组装方式。这样可以构造出不同的对象表示。

在建造者模式中,将创建对象的过程和对象的表示分离,通过一步步的构建,可以得到不同的对象。

建造者模式需要实现以下结构:

  • 指挥者(Director):负责使用建造者对象构建最终的复杂对象,它不关心具体的构建过程。
  • 建造者(Builder):定义了构建复杂对象各个部分的接口。
  • 具体建造者(Concrete Builder):实现了建造者定义的接口。
  • 产品(Product):表示被构建的复杂对象。

使用场景

  • 构建过程比较复杂时。
  • 构建过程需要独立于对象的组成部分以及它们的装配方式时。
  • 构建过程中的一些步骤是可选的或可变的时。
  • 构建的对象需要具有不同的表现形式时。
  • 需要将构建过程封装在一个独立的组件中时。

实现

使用建造者模式创建一个对话框的例子如下:

复制代码
// 具体建造者(Concrete Builder)
class DialogBuilder {
public:
    DialogBuilder() : dialog(new QDialog) {}

    void setTitle(const QString& title) {
        dialog->setWindowTitle(title);
    }

    void setMessage(const QString& message) {
        QLabel* label = new QLabel(message);
        layout.addWidget(label);
    }

    void addButton(const QString& text) {
        QPushButton* button = new QPushButton(text);
        layout.addWidget(button);
        QObject::connect(button, &QPushButton::clicked, dialog, &QDialog::accept);
    }

    QDialog* getResult() {
        dialog->setLayout(&layout);
        return dialog;
    }

private:
    QDialog* dialog;
    QVBoxLayout layout;
};

// 指挥者(Director)
class DialogDirector {
public:
    DialogDirector(DialogBuilder* builder) : builder(builder) {}

    QDialog* construct(const QString& title, const QString& message, const QString& buttonText) {
        builder->setTitle(title);
        builder->setMessage(message);
        builder->addButton(buttonText);
        return builder->getResult();
    }

private:
    DialogBuilder* builder;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    DialogBuilder builder;
    DialogDirector director(&builder);
    // 使用指挥者构建复杂对象
    QDialog* dialog = director.construct("Title", "Message", "OK");
    dialog->show();

    return app.exec();
}

这个例子省略了抽象的建造者,可以创建出qt对话框。

相关推荐
布莱克6051 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
LabVIEW开发2 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
benchmark_cc2 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
前进的李工3 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
Zenova EdgeOS3 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是4 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing034 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
正在走向自律5 小时前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
Fatbobman(东坡肘子)5 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..5 小时前
【C语言】底层程序设计
c语言·开发语言