C++设计模式 —— 建造者模式

embedded/2025/2/12 11:13:53/

C++设计模式 —— 建造者模式

我们之前已经了解了单例模式,工厂模式,今天我们来学习建造者模式

一个例子

假设你是老爹汉堡店的员工,你知道这个店的顾客非常难搞,每个人对汉堡的口味都很挑剔:
在这里插入图片描述如果每个汉堡都是一套标准的流程,没有其他的组合,我们其实可以用工厂模式来解决,但是顾客对于自己的汉堡有自己的想法,每个汉堡做出来都有可能不一样。但是如果我们手动去“构造”汉堡,光汉堡材料的排列组合就让我们头晕的了。所以,我们才有了建造者模式

什么是建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

核心思想

建造者模式通过引入一个“建造者”类来逐步构建复杂对象,而不是一次性生成。它将对象的构造过程分解为多个步骤,允许客户端按需选择步骤,从而灵活地创建不同配置的对象。

主要角色

  1. 产品(Product):最终要构建的复杂对象。
  2. 抽象建造者(Builder):定义构建产品的各个步骤的接口。
  3. 具体建造者(Concrete Builder):实现抽象建造者的接口,提供具体的构建步骤,并负责返回最终产品。
  4. 指挥者(Director):负责调用建造者的步骤,控制构建过程。

优点

  • 分离构建与表示:将对象的构建过程与表示分离,使得构建过程更加灵活。
  • 易于扩展:新增具体建造者无需修改现有代码,符合开闭原则。
  • 精细控制:允许逐步构建对象,精确控制构建过程。

缺点

  • 增加复杂性:需要定义多个类,增加了代码的复杂性。
  • 适用场景有限:适用于构建复杂对象,简单对象使用该模式可能显得繁琐。

适用场景

  • 需要创建的对象具有复杂的内部结构。
  • 对象的构建过程需要独立于其组成部分。
  • 需要构建的对象有不同的表示形式。

对于汉堡实现建造者模式

class Humburger
{
private:std::string bread;bool lettuce;bool tomato;bool cheese;bool patty;public:void setBread(std::string bread) { this->bread = bread; }void setLettuce(bool lettuce) { this->lettuce = lettuce; }void setTomato(bool tomato) { this->tomato = tomato; }void setCheese(bool cheese) { this->cheese = cheese; }void setPatty(bool patty) { this->patty = patty; }void print() const {std::cout << "Hamburger: " << bread << " with ";if (lettuce) std::cout << "lettuce, ";if (tomato) std::cout << "tomato, ";if (cheese) std::cout << "cheese, ";if (patty) std::cout << "patty, ";std::cout << "prepared.\n";}
};//建造者接口
class HumburBuilder
{
protected:Humburger* hamburger;public:void createNewHumberger(){hamburger = new Humburger();}Humburger* getHamburger() { return hamburger; }virtual void buildBread() = 0;virtual void buildLettuce() = 0;virtual void buildTomato() = 0;virtual void buildCheese() = 0;virtual void buildPatty() = 0;
};// 具体建造者实现
class ConcreteHamburgerBuilder : public HumburBuilder {
public:void buildBread() override { hamburger->setBread("Whole wheat"); }void buildLettuce() override { hamburger->setLettuce(true); }void buildTomato() override { hamburger->setTomato(false); } // 不加番茄void buildCheese() override { hamburger->setCheese(true); }void buildPatty() override { hamburger->setPatty(true); }
};// 指挥者
class Director {
private:HumburBuilder* builder;public:void setBuilder(HumburBuilder* b) { builder = b; }void constructHamburger() {builder->createNewHumberger();builder->buildBread();builder->buildLettuce();builder->buildTomato();builder->buildCheese();builder->buildPatty();}
};int main() {Director director;ConcreteHamburgerBuilder builder;director.setBuilder(&builder);director.constructHamburger();Humburger* hamburger = builder.getHamburger();hamburger->print();delete hamburger;return 0;
}

在这里插入图片描述
在这个例子中,我们通过定义一个Hamburger产品类,一个抽象的HamburgerBuilder建造者接口,以及具体的ConcreteHamburgerBuilder建造者实现了建造者模式Director类用来指挥建造过程。这样,即使要修改汉堡的配方或者增加新的选项,我们也只需要调整或新增具体的建造者实现即可,不需要改动其他部分的代码,从而提高了代码的可维护性和灵活性。


http://www.ppmy.cn/embedded/161576.html

相关文章

怎麼使用靜態住宅IP進行多社媒帳號管理

隨著社交媒體平臺的多樣化&#xff0c;很多人發現一個社媒帳號已經無法滿足需求。以下是幾個常見場景&#xff1a; 企業需求&#xff1a;企業可能需要在不同平臺上運營多個品牌帳號&#xff0c;為每個市場地區單獨設立帳號。個人需求&#xff1a;一些自由職業者或內容創作者可…

计算机毕业设计——springboot教师人事档案管理系统

作者&#xff1a;程序媛9688开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0…

MybatisPlusCRUD接口使用

1. MybatisPlus的CRUD接口 MybatisPlus提供了很多CRUD接口&#xff0c;可以直接使用这些接口来操作数据库。而不用像Mybatis那样写大量的XML文件及SQL语句。 Mapper CRUD接口 主要关键是继承BaseMapper<T>&#xff0c;其中T是实体类。 使用案例 Mapper层继承BaseMapper接…

【自学笔记】GitHub的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 GitHub使用指南详细知识点一、GitHub基础与账户管理1. GitHub简介2. 创建与管理GitHub账户3. 创建与配置仓库&#xff08;Repository&#xff09; 二、Git基础与Git…

团结引擎高性能ECS架构(下)

PPT下载链接&#xff1a;https://u3d.sharepoint.cn/:f:/s/UnityChinaResources/EiiiMzsuiL1FouTNpSkE5qABHBR69kSzmePA1FGkAvSCwA?ea0BlzX 在 2024 年 12 月 6 日 Unity 技术开放日厦门站&#xff0c;Unity 中国 DOTS 技术主管李中元带来分享《团结引擎高性能 ECS 架构》&…

[C#].net顶级语句省略main方法内容

.net顶级语句省略main方法 内容复制自&#xff1a;docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/tutorials/top-level-statements 先决条件 需要将计算机设置为运行 .NET 6&#xff0c;其中包括 C# 10 编译器。 自 Visual Studio 2022 或 .NET 6 SDK 起&#xff0c;开…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…

【R语言】获取数据

R语言自带2种数据存储格式&#xff1a;*.RData和*.rds。 这两者的区别是&#xff1a;前者既可以存储数据&#xff0c;也可以存储当前工作空间中的所有变量&#xff0c;属于非标准化存储&#xff1b;后者仅用于存储单个R对象&#xff0c;且存储时可以创建标准化档案&#xff0c…