首页 > 后端开发 > C++ > 正文

C++建造者模式实现 分步构建复杂对象

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

c++建造者模式实现 分步构建复杂对象

在C++中,建造者模式(Builder Pattern)用于分步构建复杂对象,尤其适用于对象构造过程复杂、参数多、可选配置多的情况。它将构造逻辑与表示分离,使得同样的构造过程可以创建不同的表示。

建造者模式的核心思想

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包含以下几个角色:

  • Product:要构建的复杂对象。
  • Builder:抽象接口,定义构建各部分的方法。
  • ConcreteBuilder:实现Builder接口,具体实现构建步骤。
  • Director:指挥者,调用Builder来分步构建对象。

实现示例:构建一个网页报告

假设我们要构建一个复杂的报告对象,包含标题、正文、页脚、样式等部分,使用建造者模式可以分步设置这些内容。

立即学习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";
}
登录后复制

};

北极象沉浸式AI翻译
北极象沉浸式AI翻译

免费的北极象沉浸式AI翻译 - 带您走进沉浸式AI的双语对照体验

北极象沉浸式AI翻译 0
查看详情 北极象沉浸式AI翻译

// 抽象建造者 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 = "&copy; " + 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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号