Chapter9:建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
“建造者(Builder)模式”又叫生成器模式。当我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
实际应用
工程结构
(1)抽象建造者Builder.h
(2)具体建造者ConcreteBuilder.h
(3)指挥者Director.h
(4)具体产品Product.h
(5)客户端类BuilderApp.cpp
(1)抽象建造者Builder.h
/************************************************************************
* description: 抽象建造者类
* remark:
************************************************************************/
#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_
(2)具体建造者ConcreteBuilder.h
/************************************************************************
* description: 具体建造者类
* remark:
************************************************************************/
#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_
(3)指挥者Director.h
/************************************************************************
* description: 指挥者类
* remark:
************************************************************************/
#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_
#include "Builder.h"
class CDirector
{
public:
// 用来指挥建造过程
void Construct(CBuilder* pBuilder)
{
pBuilder->BuildPartA();
pBuilder->BuildPartB();
}
};
#endif //_DIRECTOR_H_
(4)具体产品Product.h
/************************************************************************
* description: 产品类,由多个部件组成
* remark:
************************************************************************/
#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创建 产品 ……\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_
(5)客户端类BuilderApp.cpp
// BuilderApp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Director.h"
#include "ConcreteBuilder.h"
void FreeMemory(void* Pointer)
{
if (NULL != Pointer)
{
free(Pointer);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
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();
}
}
system("pause");
FreeMemory(pDirector);
FreeMemory(pBuilder1);
FreeMemory(pBuilder2);
return 0;
}