建造者模式通过分离复杂对象的构建与表示,使同一构造过程可创建不同对象。包含Product(报告)、Builder(抽象构建接口)、ConcreteBuilder(如HtmlReportBuilder)和Director(指挥构建流程)。示例中用ReportDirector指导HtmlReportBuilder分步构建简易或完整HTML报告,最终输出带样式的报告内容。该模式适用于参数多、构造复杂、需灵活配置的场景,提升代码可读性与维护性,避免伸缩构造器反模式。

在C++中,建造者模式(Builder Pattern)用于分步构建复杂对象,尤其适用于对象构造过程复杂、参数多、可选配置多的情况。它将构造逻辑与表示分离,使得同样的构造过程可以创建不同的表示。
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包含以下几个角色:
假设我们要构建一个复杂的报告对象,包含标题、正文、页脚、样式等部分,使用建造者模式可以分步设置这些内容。
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <string>
#include <memory>
<p>// 产品类:报告
class Report {
public:
std::string title;
std::string content;
std::string footer;
std::string cssStyle;</p><pre class='brush:php;toolbar:false;'>void show() const {
std::cout << "标题: " << title << "\n";
std::cout << "内容: " << content << "\n";
std::cout << "页脚: " << footer << "\n";
std::cout << "样式: " << cssStyle << "\n";
}};
// 抽象建造者 class ReportBuilder { public: virtual ~ReportBuilder() = default; virtual void setTitle(const std::string& title) = 0; virtual void setContent(const std::string& content) = 0; virtual void setFooter(const std::string& footer) = 0; virtual void setStyle(const std::string& style) = 0; virtual std::unique_ptr<Report> getReport() = 0; };
// 具体建造者:HTML报告 class HtmlReportBuilder : public ReportBuilder { std::unique_ptr<Report> report;
public: HtmlReportBuilder() { report = std::make_unique<Report>(); }
void setTitle(const std::string& title) override {
report->title = "[HTML] " + title;
}
void setContent(const std::string& content) override {
report->content = "<p>" + content + "</p>";
}
void setFooter(const std::string& footer) override {
report->footer = "© " + footer;
}
void setStyle(const std::string& style) override {
report->cssStyle = "font-family: " + style + "; color: blue;";
}
std::unique_ptr<Report> getReport() override {
return std::move(report);
}};
// 指挥者 class ReportDirector { ReportBuilder* builder;
public: explicit ReportDirector(ReportBuilder* b) : builder(b) {}
void setBuilder(ReportBuilder* b) {
builder = b;
}
// 构建简易报告
void makeSimpleReport() {
builder->setTitle("简报");
builder->setContent("这是内容");
builder->setFooter("2024");
builder->setStyle("Arial");
}
// 构建完整报告
void makeFullReport() {
builder->setTitle("年度报告");
builder->setContent("详细数据分析...");
builder->setFooter("公司名称");
builder->setStyle("Times New Roman");
}};
客户端代码通过Director和Builder协作,分步构建对象。
立即学习“C++免费学习笔记(深入)”;
int main() {
HtmlReportBuilder htmlBuilder;
ReportDirector director(&htmlBuilder);
<pre class='brush:php;toolbar:false;'>// 构建简易HTML报告
director.makeSimpleReport();
auto report = htmlBuilder.getReport();
report->show();
std::cout << "\n---\n\n";
// 构建完整报告
director.makeFullReport();
auto fullReport = htmlBuilder.getReport();
fullReport->show();
return 0;}
输出结果:
标题: [HTML] 简报 内容: <p>这是内容</p> 页脚: © 2024 样式: font-family: Arial; color: blue; <hr /><p>标题: [HTML] 年度报告 内容: <p>详细数据分析...</p> 页脚: © 公司名称 样式: font-family: Times New Roman; color: blue;</p>
建造者模式适合以下情况:
它提高了代码的可读性和可维护性,避免了“伸缩构造器反模式”(telescoping constructor)。
基本上就这些。
以上就是C++建造者模式实现 分步构建复杂对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号