设计模式之建造者模式(C++)

简介: 设计模式之建造者模式(C++)

一、建造者模式是什么?

      建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。


      建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,那建造者模式则更在乎产品的组成和细节。


      建造者模式的优点:

  1. 封装性好。有效地封装了建造过程(主要业务逻辑),使得系统整体的稳定性得到了一定保证。
  2. 解耦。产品本身和建造过程解耦,相同的建造过程可以创建出不同的产品。
  3. 产品建造过程精细化。该模式注重产品创建的整个过程,将复杂的步骤拆解得到多个相对简单的步骤,使得系统流程更清晰,且对细节的把控更精准。
  4. 易于扩展。如果有新产品需求,只需要添加一个建造者类即可,不需要改动之前的代码,符合开闭原则。

     建造者模式的缺点:

  1. 产品的组成部分和构建过程要一致,限制了产品的多样性。
  2. 若产品内部有结构上的变化,则整个系统都要进行大改,增加了后期维护成本。

二、建造者模式

2.1 结构图

      客户端即Main主函数,创建监督者,由监督者带领不同的建造者完成电脑产品的不同表示。

2.2 代码示例

      场景描述:我联系了一家外包公司,由他们的项目经理招人为我组建一批电脑,他先招了联想的团队,项目结束后;我想再弄一批对比下(甲方财大气粗),于是他们又招了惠普的团队,再次完成项目,非常不错。

//Product.h
/****************************************************/
#pragma once
#include <iostream>
using namespace std;
// 电脑产品类
class Computer
{
public:
  // 获取电脑信息
  void getComputer() {
    cout << "电脑产品配置为:" << endl;
    cout << " 处理器:" << getCPU() << endl;
    cout << " 显  卡:" << getGPU() << endl;
    cout << " 主  板:" << getMainBoard() << endl;
    cout << " 内存条:" << getRAM() << endl;
  }
  // 设置处理器
  void setCPU(string cpu){
    CPU = cpu;
  }
  // 设置显卡
  void setGPU(string gpu) {
    GPU = gpu;
  }
  // 设置主板
  void setMainBoard(string mb) {
    mainboard = mb;
  }
  // 设置内存条
  void setRAM(string ram) {
    RAM = ram;
  }
  // 获取处理器
  string getCPU() {
    return CPU;
  }
  // 获取显卡
  string getGPU() {
    return GPU;
  }
  // 获取主板
  string getMainBoard() {
    return mainboard;
  }
  // 获取内存条
  string getRAM() {
    return RAM;
  }
private:
  string CPU;                             // 处理器
  string GPU;                             // 显卡
  string mainboard;                       // 主板
  string RAM;                             // 内存条
};
//Builder.h
/****************************************************/
#pragma once
#include <iostream>
#include "Product.h"
using namespace std;
// 抽象建造者
class Builder
{
public:
  // 装配CPU
  virtual void addCPU() = 0;
  // 装配GPU
  virtual void addGPU() = 0;
  // 装配主板
  virtual void addMainBoard() = 0;
  // 装配内存
  virtual void addRAM() = 0;
  // 获取电脑产品
  Computer getComputer() {
    return m_computer;
  }
protected:
  Computer m_computer;                         // 电脑产品
};
// 联想-建造者
class LenovoBuilder : public Builder
{
public:
  // 装配CPU
  virtual void addCPU() {
    m_computer.setCPU("Intel 酷睿i7-8700K");
  }
  // 装配GPU
  virtual void addGPU() {
    m_computer.setGPU("RTX 4050");
  }
  // 装配主板
  virtual void addMainBoard() {
    m_computer.setMainBoard("B760");
  }
  // 装配内存
  virtual void addRAM() {
    m_computer.setRAM("三星DDR4 2666mhz 16G");
  }
};
// 惠普-建造者
class HPBuilder : public Builder
{
public:
  // 装配CPU
  virtual void addCPU() {
    m_computer.setCPU("Intel 酷睿i5-6300HQ");
  }
  // 装配GPU
  virtual void addGPU() {
    m_computer.setGPU("GTX 1060");
  }
  // 装配主板
  virtual void addMainBoard() {
    m_computer.setMainBoard("B660");
  }
  // 装配内存
  virtual void addRAM() {
    m_computer.setRAM("金士顿DDR4 2666mhz 16G");
  }
};
//Director.h
/****************************************************/
#pragma once
#include <iostream>
#include "Builder.h"
using namespace std;
// 监督者
class Director
{
public:
  // 构造函数
  Director(Builder* builder) {
    m_builder = builder;
  }
  // 析构函数
  ~Director() {
    if (m_builder != nullptr)
      delete m_builder;
  }
  // 替换建造者
  void setBuilder(Builder *builder) {
    m_builder = builder;
  }
  // 建造
  Computer construct() {
    m_builder->addCPU();
    m_builder->addGPU();
    m_builder->addMainBoard();
    m_builder->addRAM();
    return m_builder->getComputer();
  }
private:
  Builder *m_builder;                     // 建造者
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Director.h"
using namespace std;
int main()
{
  // 一号建造者-联想
  Builder *builder1 = new LenovoBuilder();
  cout << "联想建造者等待就业。" << endl;
  // 由监督者监督项目启动
  Director *director = new Director(builder1);
  cout << "监督者(项目经理)开始招人做项目。" << endl;
  // 联想项目完毕,获取联想电脑产品
  Computer computer1 = director->construct();
  cout << "联想项目结束。" << endl;
  computer1.getComputer();
  // 二号建造者-惠普
  Builder *builder2 = new HPBuilder();
  cout << "惠普建造者等待就业。" << endl;
  // 替换建造者
  director->setBuilder(builder2);
  cout << "监督者(项目经理)替换建造者,做新项目。" << endl;
  Computer computer2 = director->construct();
  cout << "惠普项目结束。" << endl;
  computer2.getComputer();
  return 0;
}

      程序结果如下。

       在上述示例中,我们可以看到,产品有相同的构建过程,但是不同的建造者却可以完成不同表示的产品,产品的结构类似,但具体内容各不相同。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对建造者模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解建造者模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
3月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
18天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
3月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
4月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
46 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
62 2
|
6月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
|
7月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
43 1
大话设计模式(3)——造物者一般的建造者模式
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
57 0
|
7月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
69 2