Builder生成器模式

这里可以不采用纯虚函数,原因是不想让Biulder成为一个固定的生成器,因为抽象类的函数在可实例化的子类中是必须全部实现的. 
不采用纯虚函数的优点:实现类可以实现部分函数,更加灵活.功能更加强大 

 Builder;为创建一个Product的各个部件指定的抽象接口。(可以理解为抽象生产车间)

ConcreteBuilder;实现Builder的接口,以构造和装配该产品的各个部件定义并明确他们所创建的表示,提供一个检索产品的接口。(可以理解为生产产品并交付产品)

 Director构造一个使用Builder的对象接口的对象

Product被创建的产品

缺点:

  • 产品必须有共同点,范围有限制
  • 如果内部变化复杂,将会有很多的建造类(建造车间)
#pragma once
//Product.h产品(产品里可以有多个)
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>
#include <string>
using namespace std;
class Product
{
public:
	Product() { cout << "Product零件初始化" << endl; }
	virtual ~Product(){}
	void SetColor_Producthead(string a) { Proheadcolor = a; cout<< "Producthead加色" << endl; }
	void SetColor_Productbody(string a) { Probodycolor = a; cout << "Productbody加色" << endl; }
	void SetColor_Productfoot(string a) { Profootcolor = a; cout << "Productfoot加色" << endl; }
	void Printf_Producthead() { cout << "Producthead构建完成" <<Proheadcolor<< endl; }
	void Printf_Productbody() { cout << "Productbody构建完成"<< Probodycolor<<endl; }
	void Printf_Productfoot() { cout << "Productfoot构建完成" <<Profootcolor<< endl; }
private:
	string Proheadcolor;
	string Probodycolor;
	string Profootcolor;
};
#endif // !PRODUCT_H
#pragma once
//Builder抽象生产车间
#ifndef BUILDER_H
#define BUILDER_H
#include "Product.h"

class Builder
{
public:
	Builder() {}
	virtual ~Builder(){}
	virtual void BuilderProducthead() = 0;
	virtual void BuilderProductbody() = 0;
	virtual void BuilderProductfoot() = 0;
	virtual Product * Get_Product() = 0;
};
#endif // !BUILDER_H
#pragma once
//ConcreteBuilder.h具体产品生产车间
#ifndef CONCRETEBUILDER_H
#define CONCRETEBUILDER_H

#include "Builder.h"
#include <iostream>
#include "Product.h"
#include <string>

using namespace std;

class ConcreteMANBuilder:public Builder
{
public:
	ConcreteMANBuilder() { m_Product = new Product(); cout << "ConcreteMANBuilder创建成功,正在创建Product。" << endl; }
	
	void BuilderProducthead() 
	{
		
		m_Product->SetColor_Producthead("红色帽子");
		cout << "生产MANProducthead成功" << endl;
	}
	void BuilderProductbody()
	{
		
		m_Product->SetColor_Productbody("蓝色牛仔");
		cout << "生产MANProductbody成功" << endl;
	}
	void BuilderProductfoot()
	{
		
		m_Product->SetColor_Productfoot("白色球鞋");
		cout << "生产MANProductfoot成功" << endl;
	}
	Product* Get_Product()
	{
		cout << "正在执行Ger——Product__交付你的男人" << endl;
		return m_Product;
	}
private:
	Product* m_Product;
};
class ConcreteWOMANBuilder :public Builder
{
public:
	ConcreteWOMANBuilder() { m_Product = new Product(); cout << "ConcreteWOMANBuilder创建成功,正在创建Product。" << endl; }
	
	void BuilderProducthead()
	{

		m_Product->SetColor_Producthead("黑色长发");
		cout << "生产WOMANProducthead成功" << endl;
	}
	void BuilderProductbody()
	{

		m_Product->SetColor_Productbody("白色长裤");
		cout << "生产WOMANProductbody成功" << endl;
	}
	void BuilderProductfoot()
	{

		m_Product->SetColor_Productfoot("黑色高干跟鞋");
		cout << "生产WOMANProductfoot成功" << endl;
	}
	Product* Get_Product()
	{
		cout << "正在执行Ger——Product__你媳妇造出来了" << endl;
		return m_Product;
	}
private:
	Product* m_Product;
};
#endif // !CONCRETEBUILDER_H
#pragma once
//Director.h指挥产品组装
#ifndef DIRECTOR_H
#define DIRECTOR_H

#include <iostream>
#include "Builder.h"
using namespace std;

class Director
{
public:
	void construct(Builder* b)
	{
		b->BuilderProducthead();
		b->BuilderProductbody();
		b->BuilderProductfoot();
		cout << "Director的construct已执行————组装完成你的人" << endl;
	}
	
};
#endif // !DIRECTOR_H

//main.cpp主函数调用测试

#include <iostream>
#include "Builder.h"
#include "Director.h"
#include "ConcreteBuilder.h"

int main()
{
	Builder* bui1 = new ConcreteMANBuilder();//创建男人生产车间
	Director* dir = new Director();
	dir->construct(bui1);//组装
	Product* man = bui1->Get_Product();//提取你的娃
	//显示你儿子特征
	man->Printf_Producthead();
	man->Printf_Productbody();
	man->Printf_Productfoot();
	Builder* bui2 = new ConcreteWOMANBuilder();//你媳妇生产线
	dir->construct(bui2);//组装你媳妇
	Product* woman = bui2->Get_Product();//提取你媳妇
	//显示你媳妇样貌
	woman->Printf_Producthead();
	woman->Printf_Productbody();
	woman->Printf_Productfoot();

	delete bui1;
	bui1 = NULL;
	delete man;
	man = NULL;
	delete bui2;
	bui2 = NULL;
	delete woman;
	woman = NULL;
	delete dir;
	dir = NULL;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38753888/article/details/85343075