设计模式(2)--对象创建(2)--生成器

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)。

相关推荐

  1. GO设计模式——2、工厂方法模式创建型)

    2023-12-13 11:22:05       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 11:22:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 11:22:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 11:22:05       82 阅读
  4. Python语言-面向对象

    2023-12-13 11:22:05       91 阅读

热门阅读

  1. C#学习相关系列之自定义遍历器

    2023-12-13 11:22:05       64 阅读
  2. vue的组件传值

    2023-12-13 11:22:05       68 阅读
  3. 力扣139. 单词拆分

    2023-12-13 11:22:05       57 阅读
  4. ES SQL Translate API

    2023-12-13 11:22:05       60 阅读
  5. LeetCode-739. 每日温度【栈 数组 单调栈】

    2023-12-13 11:22:05       62 阅读
  6. React-hook-form-mui (一):基本使用

    2023-12-13 11:22:05       52 阅读
  7. c#面试基础语法——ref、out、using关键字

    2023-12-13 11:22:05       57 阅读