这里可以不采用纯虚函数,原因是不想让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;
}