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