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

devtools/2025/2/12 0:25:10/

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/devtools/158063.html

相关文章

Godot开发框架探索#2

前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊&#xff0c;最近纠结的点有以下几个&#xff1a;1.渴求一个稳定的Godot开发框架&#xff1b;2.要不要使用更轻量的开发框架&#xff0c;或者直接写引擎&#xff1b; 3.对自己想做的游戏品类拿不定主意。…

基于Spring Boot的历史馆藏系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

十四. Redis 新功能

十四. Redis 新功能 文章目录 十四. Redis 新功能1. ACL2. IO多线程3. 工具支持 Cluster4. 其它新功能-介绍5. 最后&#xff1a; 1. ACL ACL 参考官网&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/ ACL 基本介绍&#xff1a; Re…

ArrayList和LinkedList有什么区别?在什么情况下使用ArrayList更高效?

ArrayList和LinkedList在Java中是两种常用的数据结构&#xff0c;分别基于数组和链表实现。它们在性能、内存使用和适用场景上各有特点。 ArrayList与LinkedList的主要区别 数据结构&#xff1a; ArrayList&#xff1a;基于动态数组实现&#xff0c;元素存储在连续的内存空间…

矩阵NFC碰一碰发视频的源码技术开发攻略,支持OEM

引言 在短视频与营销深度融合的当下&#xff0c;矩阵碰一碰发视频功能为商家的营销推广带来了新的活力。通过简单的碰一碰操作&#xff0c;就能快速发布视频到多个平台&#xff0c;极大地提高了营销效率。本文将深入剖析矩阵碰一碰发视频的源码技术开发&#xff0c;带你一步步…

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data&#xff0c;存放有向图信息 data中每个点所在的行序号为起始点序号&#xff0c;列为终点序号。 比如&#xff1a;值4的坐标为(1,2)即点1到点2距离为4&#xff1b;值8的坐标为(6,7)…

前端开发架构师Prompt指令的最佳实践

前端开发架构师Prompt 提示词可作为系统提示词使用&#xff0c;可基于用户的需求输出对应的编码方案。 本次提示词偏向前端开发的使用&#xff0c;如有需要可适当修改关键词和示例。 推荐使用 Cursor 中作为自定义指令使用Cline 插件中作为自定义指令使用在力所能及的范围内使…

实验5 配置OSPFv2验证

实验5 配置OSPFv2验证 1.实验目的 &#xff08;1&#xff09;OSPFv2 验证的类型和意义。 &#xff08;2&#xff09;配置基于区域的 OSPFv2 简单口令验证和 MD5 验证的方法。 &#xff08;3&#xff09;配置基于链路的 OSPFv2 简单口令验证和 MD5 验证的方法。 2.实验准备 配置…