[设计模式] 建造者模式
创始人
2024-05-25 09:00:25
0

文章目录

  • 什么是建造者模式
  • 建造者模式
    • 建造者模式中的角色
    • UML类图
    • 代码实现
  • 建造者模式与工厂模式的区别

什么是建造者模式

建造者模式(Builder Pattern)是一种创建型的设计模式,它将一个复杂对象的构建与它的表示分离,也就是复杂的构建隐藏起来,并且加以抽象。

它的好处是建造者独立,易扩展。而且便于控制细节风险。缺点是产品必须有共同点,范围有限制。如内部变化复杂,会有很多的建造类。

建造者模式

建造者模式中的角色

建造者模式中的所有角色如下:

  • 产品(Product):产品是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
  • 抽象建造者(Builder):抽象建造者为创建一个产品对象的各个部件指定抽象接口。
  • 具体建造者(ConcreteBuilder):具体建造者实现了抽象建造者接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
  • 指挥者(Director):指挥者负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可调用建造者对象的部件与装配方法,完成发展对象的建造。

UML类图

在这里插入图片描述

代码实现

产品类:

class ProductComputer{
private:string m_CPU;string m_RAM;string m_DISK;
public:ProductComputer(){cout<<"Constructor of Product"<cout<<"Destructor of Product"< this->m_CPU = CPU;}void setRAM(string RAM){this->m_RAM = RAM;}void setDISK(string DISK){this->m_DISK = DISK; }void showHW(){/* definition of split line:#define     SPLIT_LINE "============================="#define SUB_SPLIT_LINE "-----------------------------"*/cout<

其中在输出的时候,为了使输出更加清晰,我们定义了分隔线SPLIT_LINESUB_SPLIT_LINE,这个并不是必要的,你可以选择去掉:

#define     SPLIT_LINE "============================="
#define SUB_SPLIT_LINE "-----------------------------"

创建者接口(抽象创建者):

class IBuilder
{
public:ProductComputer *m_product;
public:IBuilder(){cout<<"Constructor of Interface Builder"<cout<<"Destructor of Interface Builder"<delete m_product;m_product = nullptr;}}
public:virtual void buildCPU () = 0;virtual void buildRAM () = 0;virtual void buildDISK() = 0;virtual ProductComputer* getProductPtr() = 0;
};

具体创建者:

class ConcreteBuilder: public IBuilder{
public:ConcreteBuilder(){cout<<"Constructor of ConcreteBuilder"<cout<<"Destructor of ConcreteBuilder"<this->m_product->setCPU("Intel Core i7-13700KF");}void buildRAM(){this->m_product->setRAM("Kingston FURY 32GB DDR5");}void buildDISK(){this->m_product->setDISK("WD SSD M.2(NVMe) 500G");}ProductComputer* getProductPtr(){return m_product;}
};

指挥者类:

class Director{
private:IBuilder* m_builder;
public:Director(){cout<<"Constructor of Director"<cout<<"Destructor of Director"<this->m_builder = builder;}ProductComputer* construct(){m_builder->buildCPU();m_builder->buildRAM();m_builder->buildDISK();return m_builder->getProductPtr();}
};

主函数:

int main(){Director *director = new Director();IBuilder* builder = new ConcreteBuilder();director->setBuilder(builder);ProductComputer* computer = director->construct();computer->showHW();delete director;delete (ConcreteBuilder*)builder;//to free the interface and conreatebuilder
}

Notice
这里一定要注意对于创建者delete时需要使用下面这样:

delete (ConcreteBuilder*)builder;

否则的话只会析构Ibuilder而不会析构ConcreteBuilder

输出如下:

Constructor of Director
Constructor of Interface Builder
Constructor of Product
Constructor of ConcreteBuilder
=============================
Computer Hardware List:
-----------------------------
CPU:  Intel Core i7-13700KF
RAM:  Kingston FURY 32GB DDR5
DISK: WD SSD M.2(NVMe) 500G
=============================
Destructor of Director
Destructor of ConcreteBuilder
Destructor of Interface Builder
Destructor of Product

建造者模式与工厂模式的区别

在看完上面代码后,我们应该对建造者模式有了一定了解,我们可以看出:建造者模式更加关注与零件装配的顺序。然而工厂模式不需要关注这么多,只需创建实例即可。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...