将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
#pragma once
#include "stdafx.h"
#include<list>
#include<string>
#include<iostream>
#include<windows.h>
using namespace std;
//设计模式-建造者模式 Builder
//Product类-产品类,由多个部件组成。
class Product {
private:
list<string>mParts;
public:
Product() {
mParts.clear();
}
VOID Add(string strPart) {
mParts.push_back(strPart);
}
VOID Show() {
cout << "产品创建" << endl;
for each(string index in mParts) {
cout << index << endl;
}
}
};
//Builder类-抽象建造者
class Builder {
public:
virtual VOID BuildPartA() = 0;
virtual VOID BuildPartB() = 0;
virtual Product* GetProduct() = 0;
};
//建造者1
class ConcreteBuilder1 :public Builder {
private:
Product * mpProduct = NULL;
public:
ConcreteBuilder1() {mpProduct = new Product();}
~ConcreteBuilder1() {delete mpProduct;}
VOID BuildPartA() {
mpProduct->Add("部件A");
}
VOID BuildPartB() {
mpProduct->Add("部件B");
}
Product* GetProduct() {
return mpProduct;
}
};
//建造者2
class ConcreteBuilder2 :public Builder {
private:
Product * mpProduct = NULL;
public:
ConcreteBuilder2() { mpProduct = new Product(); }
~ConcreteBuilder2() { delete mpProduct; }
VOID BuildPartA() {
mpProduct->Add("部件X");
}
VOID BuildPartB() {
mpProduct->Add("部件Y");
}
Product* GetProduct() {
return mpProduct;
}
};
//Director-指挥者类
class Director {
public:
VOID Construct(Builder *pConcreteBuilder) {
pConcreteBuilder->BuildPartA();
pConcreteBuilder->BuildPartB();
}
};
int main()
{
Director *mDirector = new Director();
ConcreteBuilder1 * pBuilder1 = new ConcreteBuilder1();
ConcreteBuilder2 * pBuilder2 = new ConcreteBuilder2();
mDirector->Construct(pBuilder1);
mDirector->Construct(pBuilder2);
Product *pProduct1 = pBuilder1->GetProduct();
Product *pProduct2 = pBuilder2->GetProduct();
pProduct1->Show();
pProduct2->Show();
delete mDirector;
delete pBuilder1, delete pBuilder2;
//delete pProduct1, delete pProduct2;
getchar();
return 0;
}