设计模式(2)--对象创建(2)--生成器
2023-12-13 10:34:51
1. 意图
? ? 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2. 四种角色
? ? 指挥(Director)、抽象生成器(Builder)、具体生成器(Concrete Builder)、产品(Product)
3. 优点
? ? 3.1 可以改变一个产品的内部表示(通过定义新的生成器)。
? ? 3.2 将构造代码和表示代码分开。
? ? 3.3 可对构造过程进行更精细的控制。在Director的Construct函数。
4. 缺点
? ? N/A
5. 相关模式
? ? 5.1 Builder着重于一步步构造一个复杂对象,而抽象工厂着重于多个系列的产品对象。
? ? ? ? ? Builder在最后一步返回产品,而抽象工厂是立即返回产品的。
? ? 5.2 Composite通常是用Builder生成的。
6. 代码示意(C++)
#pragma once
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Product
{
private:
vector<string> m_parts;
public:
void Add(string strtemp)
{
m_parts.push_back(strtemp);
}
void Show()
{
vector<string>::iterator it = m_parts.begin();
while (it != m_parts.end())
{
cout << *it << endl;
++it;
}
}
};
class Builder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual void BuildPartC() = 0;
virtual Product* GetResult() = 0;
};
class ConcreteBuilder1 :
public Builder
{
private:
Product* m_pProduct;
public:
ConcreteBuilder1()
{
m_pProduct = new Product();
}
~ConcreteBuilder1()
{
delete m_pProduct;
}
virtual void BuildPartA()
{
m_pProduct->Add("A零件");
}
virtual void BuildPartB()
{
m_pProduct->Add("B零件");
}
virtual void BuildPartC()
{
m_pProduct->Add("C零件");
}
virtual Product* GetResult()
{
return m_pProduct;
}
};
class ConcreteBuilder2 :
public Builder
{
private:
Product* m_pProduct;
public:
ConcreteBuilder2()
{
m_pProduct = new Product();
}
~ConcreteBuilder2()
{
delete m_pProduct;
}
virtual void BuildPartA()
{
m_pProduct->Add("不一样的A零件");
}
virtual void BuildPartB()
{
m_pProduct->Add("不一样的B零件");
}
virtual void BuildPartC()
{
m_pProduct->Add("不一样的C零件");
}
virtual Product* GetResult()
{
return m_pProduct;
}
};
class Director
{
private:
Builder* m_pBuilder;
public:
Director(Builder* pBuilder)
{
m_pBuilder = pBuilder;
}
void Construct()
{
m_pBuilder->BuildPartA();
m_pBuilder->BuildPartB();
m_pBuilder->BuildPartC();
}
};
#include "Builder.h"
int main() {
Builder* pBuilder = new ConcreteBuilder1;
Director* pDirector = new Director(pBuilder);
pDirector->Construct();
pBuilder->GetResult()->Show();
delete pDirector;
delete pBuilder;
return 0;
}
运行结果:
6.1?更换生成器,只需在main函数里用ConcreteBuilder2来替换ConcreteBuilder1即可(3.1)。
6.2 可以创建不同的Director来控制所需零件来组成不同产品(3.2)。
6.3 Director的Construct函数可以控制构造过程(3.3)。
文章来源:https://blog.csdn.net/myepicure/article/details/134764594
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!