第13章建造者模式

一 概念

  • 当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式,又叫生成器模式,建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。

  • 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

二 角色

  • Builder 是为创建一个Product对象的各个部件制定的抽象接口
  • ConcreteBuilder 是具体的创建者,实现Builder接口,构造和装配各个部件
  • Product 具体的产品角色
  • Director 指挥者,他是构建一个使用Builder接口的对象

三 C++代码实现

//建造者模式
#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//产品类-由多个部件组成
class Product
{
public:
	void Add(string part)  //添加产品部件
	{
		parts.push_back(part);
	}
	void Show()  //列举所有的产品部件
	{
		cout << "
产品 创建 --" << endl;
		for (vector<string>::iterator it = parts.begin(); it != parts.end(); ++it)
		{
			cout << *(it) << endl;
		}
	}
private:
	vector<string> parts;
};
//Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成
//并声明一个得到产品建造后结果的方法GetResult
class Builder
{
public:
	virtual void BuildPartA() = 0;
	virtual void BuildPartB() = 0;
	virtual Product* GetResult() = 0;
};

//具体建造者类
class ConcreteBuilder1 : public Builder
{
public:
	ConcreteBuilder1()
	{
		product = new Product;
	}
	~ConcreteBuilder1()
	{
		delete product;
	}
	void BuildPartA() override
	{
		product->Add("部件A");
	}
	void BuildPartB() override
	{
		product->Add("部件B");
	}
	Product* GetResult() override
	{
		return product;
	}
private:
	Product* product;

};

//具体建造者类
class ConcreteBuilder2 : public Builder
{
public:
	ConcreteBuilder2()
	{
		product = new Product;
	}
	~ConcreteBuilder2()
	{
		delete product;
	}
	void BuildPartA() override
	{
		product->Add("部件X");
	}
	void BuildPartB() override
	{
		product->Add("部件Y");
	}
	Product* GetResult() override
	{
		return product;
	}
private:
	Product* product;

};

//指挥者类
class Director
{
public:
	void Construct(Builder* builder)
	{
		builder->BuildPartA();
		builder->BuildPartB();
	}
};

//客户端
int main()
{
	Director* director = new Director;
	Builder* b1 = new ConcreteBuilder1;
	Builder* b2 = new ConcreteBuilder2;

	//指挥者用ConcreteBuilder1的方法来建造产品
	director->Construct(b1);
	Product* p1 = b1->GetResult();
	p1->Show();
	//指挥者用ConcreteBuilder2的方法来建造产品
	director->Construct(b2);
	Product* p2 = b2->GetResult();
	p2->Show();
    
	system("pause");

	return 0;
}

参考资料
1 《大话设计模式C++实现-第13章-建造者模式》 https://blog.csdn.net/xiqingnian/article/details/42005627
2 《大话设计模式》 程杰 著

原文地址:https://www.cnblogs.com/Manual-Linux/p/11121394.html