建造者模式简介
建造者模式(Builder Pattern)是一种创建型设计模式,它通过使用多个简单的对象一步步构建一个复杂对象。建造者模式允许你分步骤创建复杂对象,并且你可以控制每个步骤如何执行。该模式常用于对象的创建过程非常复杂且需要有多个可选参数的场景。
建造者模式的应用场景
假设你在开发一个复杂的报告生成器应用程序,不同的报告可能有不同的格式、内容、样式等。例如,PDF格式的报告和HTML格式的报告的生成方式和结构都不同。这时你可以使用建造者模式,将生成报告的步骤封装在不同的建造者中,这样可以更灵活地构建复杂的报告对象。
建造者模式示例代码
#include <QDebug>
#include <QString>
// 报告类:包含标题、内容、页眉、页脚等属性
class Report {
public:
QString title;
QString content;
QString header;
QString footer;
void show() const {
qDebug() << "Title:" << title;
qDebug() << "Content:" << content;
qDebug() << "Header:" << header;
qDebug() << "Footer:" << footer;
}
};
// 报告建造者接口:定义构建报告各部分的抽象方法
class ReportBuilder {
public:
virtual ~ReportBuilder() = default;
virtual void buildTitle(const QString &title) = 0;
virtual void buildContent(const QString &content) = 0;
virtual void buildHeader(const QString &header) = 0;
virtual void buildFooter(const QString &footer) = 0;
virtual Report* getResult() = 0;
};
// PDF报告建造者:具体实现了PDF格式报告的建造步骤
class PDFReportBuilder : public ReportBuilder {
private:
Report* report;
public:
PDFReportBuilder() {
report = new Report();
}
void buildTitle(const QString &title) override {
report->title = "[PDF Title] " + title;
}
void buildContent(const QString &content) override {
report->content = "[PDF Content] " + content;
}
void buildHeader(const QString &header) override {
report->header = "[PDF Header] " + header;
}
void buildFooter(const QString &footer) override {
report->footer = "[PDF Footer] " + footer;
}
Report* getResult() override {
return report;
}
};
// HTML报告建造者:具体实现了HTML格式报告的建造步骤
class HTMLReportBuilder : public ReportBuilder {
private:
Report* report;
public:
HTMLReportBuilder() {
report = new Report();
}
void buildTitle(const QString &title) override {
report->title = "<h1>" + title + "</h1>";
}
void buildContent(const QString &content) override {
report->content = "<p>" + content + "</p>";
}
void buildHeader(const QString &header) override {
report->header = "<header>" + header + "</header>";
}
void buildFooter(const QString &footer) override {
report->footer = "<footer>" + footer + "</footer>";
}
Report* getResult() override {
return report;
}
};
// 指挥者类:负责指挥建造者一步步构建复杂的对象
class ReportDirector {
public:
void constructReport(ReportBuilder* builder) {
builder->buildTitle("Annual Report");
builder->buildContent("This is the content of the annual report.");
builder->buildHeader("Company Name");
builder->buildFooter("Page 1");
}
};
// 使用示例
int main() {
ReportDirector director;
// 使用PDF建造者
PDFReportBuilder pdfBuilder;
director.constructReport(&pdfBuilder);
Report* pdfReport = pdfBuilder.getResult();
pdfReport->show();
delete pdfReport;
// 使用HTML建造者
HTMLReportBuilder htmlBuilder;
director.constructReport(&htmlBuilder);
Report* htmlReport = htmlBuilder.getResult();
htmlReport->show();
delete htmlReport;
return 0;
}
代码解析
-
Report类:这是一个复杂对象,包含标题、内容、页眉、页脚等属性。该对象将由建造者逐步创建。
-
ReportBuilder接口:这是一个抽象接口,定义了创建复杂对象的各个步骤,包括构建标题、内容、页眉、页脚的方法。不同的具体建造者可以实现这个接口来创建不同格式的报告。
-
PDFReportBuilder和HTMLReportBuilder:它们是具体的建造者,实现了如何创建PDF和HTML格式报告的逻辑。每个建造者负责特定格式报告的构建步骤。
-
ReportDirector类:这个类负责指导建造者一步步地创建复杂对象。在这个例子中,它会调用建造者的方法来构建完整的报告对象。
-
使用示例:在
main
函数中,首先创建一个PDF报告建造者,使用指挥者构建完整的PDF报告。然后,类似地创建一个HTML格式的报告。
建造者模式的优点
- 分步构建复杂对象:建造者模式允许将复杂对象的创建过程分解为多个步骤,且这些步骤可以独立变化。
- 代码的可扩展性强:如果以后需要增加新的报告格式,只需新增一个具体的建造者类,而无需修改原有的代码。
- 清晰的代码结构:使用建造者模式可以避免将复杂对象的构建逻辑混杂在一起,使代码更加清晰易读。
与工厂模式的区别
工厂模式专注于创建单一对象,而建造者模式则注重一步步构建一个复杂对象。在建造者模式中,整个构建过程是可控的,而工厂模式一般会直接返回完整的对象。
这个例子展示了如何使用建造者模式构建复杂的报告对象,并通过不同的建造者实现了报告格式的灵活切换。在实际开发中,建造者模式非常适合用于对象的创建过程繁杂且需要多个可选参数的场景。
标签:Qt,对象,建造,模式,C++,override,QString,report,设计模式 From: https://blog.csdn.net/m0_46494667/article/details/142201349