建造者模式(c++实现)
建造者模式
模式定义
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式动机
- 如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
- 主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
- 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
UML类图
说明:
- Builder:是为创建一个Product对象的各个部件指定的抽象接口。
- ConcreteBuilder:是具体的建造者,实现Builder接口,构造和装配各个部件。
- Product:具体的产品角色。
- Director:指挥者,它是构建一个使用Builder接口的对象。
源码实现
- builder.h
#include "product.h"
class Builder
{
public:
Builder();
virtual ~Builder(){}
virtual void AddPartA();
virtual void AddPartB();
Product* GetProduct();
protected:
Product* m_Product;
};
- builder.cpp
#include <iostream>
#include "builder.h"
Builder::Builder()
{
m_Product = new Product();
}
void Builder::AddPartA()
{
m_Product->AddPart("PartA");
}
void Builder::AddPartB()
{
m_Product->AddPart("PartB");
}
Product* Builder::GetProduct()
{
if(m_Product->PartsCount() > 0)
return m_Product;
else
std::cout << "产品还未组装好" << std::endl;
}
- concretebuilder1.h
#include "builder.h"
class ConcreteBuilder1 : public Builder
{
public:
ConcreteBuilder1();
void AddPartA() override;
void AddPartB() override;
};
- concretebuilder1.cpp
#include "concretebuilder1.h"
ConcreteBuilder1::ConcreteBuilder1()
{
}
void ConcreteBuilder1::AddPartA()
{
m_Product->AddPart("Part1");
}
void ConcreteBuilder1::AddPartB()
{
m_Product->AddPart("Part2");
}
- director.h
#include "builder.h"
class Director
{
public:
Director();
void Construct(Builder* builder);
};
- director.cpp
#include "director.h"
Director::Director()
{
}
void Director::Construct(Builder *builder)
{
builder->AddPartA();
builder->AddPartB();
}
- product.h
#include <list>
#include <string>
class Product
{
public:
Product();
void AddPart(std::string part);
void Show();
int PartsCount();
private:
std::list<std::string> m_Parts;
};
- product.cpp
#include "product.h"
#include <iostream>
Product::Product()
{
}
void Product::AddPart(std::string part)
{
m_Parts.push_back(part);
}
void Product::Show()
{
std::cout << "组成部分:" << std::endl;
for(auto part : m_Parts)
{
std::cout << part << std::endl;
}
}
int Product::PartsCount()
{
return m_Parts.size();
}
- main.cpp
#include <iostream>
#include <memory>
#include "concretebuilder1.h"
#include "concretebuilder2.h"
#include "director.h"
using namespace std;
int main()
{
std::shared_ptr<Builder> builder1 = std::make_shared<ConcreteBuilder1>();
std::shared_ptr<Builder> builder2 = std::make_shared<ConcreteBuilder2>();
Director director;
director.Construct(builder1.get());
Product* product1 = builder1->GetProduct();
product1->Show();
director.Construct(builder2.get());
Product* product2 = builder2->GetProduct();
product2->Show();
return 0;
}
- 运行结果
组成部分:
Part1
Part2
组成部分:
PartX
PartY
优点
建造者模式的优点
- 使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
缺点
模式的缺点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?