建造者模式

理论

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

又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。

建造者模式的使用场景:

主要用于创建一些复杂的对象,那些对象内部构建间的建造顺序通常是固定的,但对象内部的构建通常面临着复杂的变化。

建造者模式的好处:

可以使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

实例

根据用户的选择设计特定的产品

初步实现

#include <iostream>
#include <list>
using namespace std;

//产品1
class ProductBulider1 {
public:
	void Add(string _parts){
		parts->push_back(_parts);
	}

	void Build(){
		Add("部件A");
		Add("部件B");
	}

	void Show(){
		cout << "产品A创建:";
		for (list<string>::iterator it = parts->begin(); it != parts->end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	}
private:
	list<string>* parts = new list<string>;
};

//产品2
class ProductBulider2 {
public:
	void Add(string _parts){
		parts->push_back(_parts);
	}

	void Build(){
		Add("部件X");
		Add("部件Y");
	}

	void Show(){
		cout << "产品B创建:";
		for (list<string>::iterator it = parts->begin(); it != parts->end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	}
private:
	list<string>* parts = new list<string>;
};

//客户端
int main()
{
	ProductBulider1* productA = new ProductBulider1;
	productA->Build();
	productA->Show();

	ProductBulider2* productB = new ProductBulider2;
	productB->Build();
	productB->Show();

	delete productA;
	delete productB;

	system("pause");
	return 0;
}

建造者模式

#include <iostream>
#include <list>
using namespace std;

//产品类
class Product {
public:
	void Add(string _parts){
		parts->push_back(_parts);
	}

	void Show() {
		cout << "产品创建:";
		for (list<string>::iterator it = parts->begin(); it != parts->end(); it++){
			cout << *it << " ";
		}
		cout << endl;
	}

private:
	list<string>* parts = new list<string>;
};

//抽象建造类
class Builder {
public:
	//建造产品所需物品
	virtual void BuilderPart1() = 0;
	virtual void BuilderPart2() = 0;
	//成品
	virtual Product* GetResult() = 0;
};

//具体建造者类1:设计产品1
class ConcreteBulider1 :public Builder {
public:
	void BuilderPart1() {
		product->Add("部件A");
	}
	void BuilderPart2() {
		product->Add("部件B");
	}
	Product* GetResult() {
		return product;
	}

private:
	Product* product = new Product;
};

//具体建造者类2:设计产品2
class ConcreteBulider2 :public Builder {
public:
	void BuilderPart1() {
		product->Add("部件X");
	}
	void BuilderPart2() {
		product->Add("部件Y");
	}
	Product* GetResult() {
		return product;
	}

private:
	Product* product = new Product;
};

//指挥者类
class Director {
public:
	void Construct(Builder* _builder) {
		_builder->BuilderPart1();
		_builder->BuilderPart2();
	}
};

//客户端
int main()
{
	//请一个设计者
	Director* director = new Director;
	//具体的建造者
	Builder* b1 = new ConcreteBulider1;
	Builder* b2 = new ConcreteBulider2;

	//设计者指挥建造者生产
	director->Construct(b1);
	Product* p1 = b1->GetResult();
	p1->Show();

	director->Construct(b2);
	Product* p2 = b2->GetResult();
	p2->Show();

	delete b1;
	delete b2;
	delete director;
	delete p1;
	delete p2;

	system("pause");
	return 0;
}

  

 

posted @ 2022-09-12 10:43  KYZH  阅读(18)  评论(0编辑  收藏  举报