建造者模式(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include <string>
#include <list>
#include <iostream>
using namespace std;
class CProduct
{
public:
// 添加产品部件
void Add(const string& strPart)
{
m_listPart.push_back(strPart);
}
void Show(void)
{
cout << "创建 产品 ……\n";
list<string>::iterator lIter;
for (lIter = m_listPart.begin(); lIter != m_listPart.end(); lIter++)
{
cout << *lIter << endl;
}
}
private:
list<string> m_listPart;
};
#endif _PRODUCT_H_
/************************************************************************
* Builder.h
* description: 抽象建造者类
* remark: Builder是为创建一个Product对象的各个部件指定的抽象接口
************************************************************************/
#ifndef _BUILDER_H_
#define _BUILDER_H_
#include "Product.h"
class CBuilder
{
public:
// 产品由两个部件PartA和PartB组成
virtual void BuildPartA(void) = 0;
virtual void BuildPartB(void) = 0;
// 得到产品建造后结果
virtual CProduct* GetResult(void) = 0;
};
#endif _BUILDER_H_
/************************************************************************
* ConcreteBuilder.h
* description: 具体建造者类
* remark:实现Builder接口,构造和装配各个部件
************************************************************************/
#ifndef _CONCRETE_BUILDER_H_
#define _CONCRETE_BUILDER_H_
#include "Builder.h"
#include "Product.h"
class CConcreteBuilder1 : public CBuilder
{
public:
CConcreteBuilder1()
{
m_pProduct = NULL;
m_pProduct = new CProduct();
}
// 建造具体的部件Alice
void BuildPartA(void)
{
if (NULL != m_pProduct)
{
m_pProduct->Add("部件Alice");
}
}
// 建造具体的部件Bob
void BuildPartB(void)
{
if (NULL != m_pProduct)
{
m_pProduct->Add("部件Bob");
}
}
CProduct* GetResult(void)
{
return m_pProduct;
}
private:
CProduct* m_pProduct;
};
class CConcreteBuilder2 : public CBuilder
{
public:
CConcreteBuilder2()
{
m_pProduct = NULL;
m_pProduct = new CProduct();
}
// 建造具体的部件Carey
void BuildPartA(void)
{
if (NULL != m_pProduct)
{
m_pProduct->Add("部件Carey");
}
}
// 建造具体的部件Doom
void BuildPartB(void)
{
if (NULL != m_pProduct)
{
m_pProduct->Add("部件Doom");
}
}
CProduct* GetResult(void)
{
return m_pProduct;
}
private:
CProduct* m_pProduct;
};
#endif _CONCRETE_BUILDER_H_
/************************************************************************
* Director.h
* description: 指挥者类
* remark:指挥者类是构建一个使用Builder接口的对象
************************************************************************/
#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_
#include "Builder.h"
class CDirector
{
public:
// 用来指挥建造过程
void Construct(CBuilder* pBuilder)
{
pBuilder->BuildPartA();
pBuilder->BuildPartB();
}
};
#endif _DIRECTOR_H_
//main.cpp
#include "stdio.h"
#include "Director.h"
#include "ConcreteBuilder.h"
void FreeMemory(void* Pointer)
{
if (NULL != Pointer)
{
delete Pointer;
}
}
int main()
{
CDirector* pDirector = NULL;
pDirector = new CDirector();
CBuilder* pBuilder1 = new CConcreteBuilder1();
CBuilder* pBuilder2 = new CConcreteBuilder2();
// 指挥者用CConcreteBuilder1的方法来建造产品
if (NULL != pDirector)
{
pDirector->Construct(pBuilder1);
CProduct* pProduct1 = pBuilder1->GetResult();
if (NULL != pProduct1)
{
pProduct1->Show();
}
}
if (NULL != pDirector)
{
pDirector->Construct(pBuilder2);
CProduct* pProduct2 = pBuilder2->GetResult();
if (NULL != pProduct2)
{
pProduct2->Show();
}
}
FreeMemory(pDirector);
FreeMemory(pBuilder1);
FreeMemory(pBuilder2);
return 0;
}