ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

建造者模式

2022-09-12 11:04:31  阅读:220  来源: 互联网

标签:Product void 建造 模式 Add parts new


理论

建造者模式(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;
}

  

 

标签:Product,void,建造,模式,Add,parts,new
来源: https://www.cnblogs.com/kyzh-lhl/p/16685635.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有