基本概念
建造者模式是一种创建型设计模式,它允许你创建复杂对象的过程独立于该对象的组成部分以及它们的组装方式。这样可以构造出不同的对象表示。
在建造者模式中,将创建对象的过程和对象的表示分离,通过一步步的构建,可以得到不同的对象。
建造者模式需要实现以下结构:
- 指挥者(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对话框。