以下情况应当使用建造者模式:
1、 需要生成的产品对象有复杂的内部结构(BuildPartA和BuildPartB)。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序(先BuildPartA和BuildPartB)。
使用建造者模式主要有以下效果:
1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关(CBuilder是个抽象接口,对扩展(继承)开放。对修改封闭)
实现源码如下
#ifndef DEF_BUILDER_H_
#define DEF_BUILDER_H_
#include "Product.h"
class CBuilder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual CProduct* GetResult() = 0;
};
class ConCreateBuilder1 : public CBuilder
{
public:
void BuildPartA();
void BuildPartB();
CProduct* GetResult();
private:
CProduct* m_pProduct;
};
class ConCreateBuilder2 : public CBuilder
{
public:
void BuildPartA();
void BuildPartB();
CProduct* GetResult();
private:
CProduct* m_pProduct;
};
#endif
#ifndef DEF_DIRECTOR_H_
#define DEF_DIRECTOR_H_
#include "Builder.h"
class CDirector
{
public:
void Construct(CBuilder* apBuilder);
};
#endif
#ifndef DEF_PRODUCT_H_
#define DEF_PRODUCT_H_
#include <string>
#include <list>
using namespace std;
class CProduct
{
public:
void Add(string aoStr);
void Show();
private:
list<string> m_oParts;
};
#endif
#include "stdafx.h"
#include "Builder.h"
void ConCreateBuilder1::BuildPartA()
{
m_pProduct = new CProduct;
m_pProduct->Add("PartA");
}
void ConCreateBuilder1::BuildPartB()
{
m_pProduct->Add("PartB");
}
CProduct* ConCreateBuilder1::GetResult()
{
return m_pProduct;
}
void ConCreateBuilder2::BuildPartA()
{
m_pProduct = new CProduct;
m_pProduct->Add("PartX");
}
void ConCreateBuilder2::BuildPartB()
{
m_pProduct->Add("PartY");
}
CProduct* ConCreateBuilder2::GetResult()
{
return m_pProduct;
}
#include "stdafx.h"
#include "Director.h"
void CDirector::Construct(CBuilder* apBuilder)
{
if (NULL == apBuilder)
{
return;
}
apBuilder->BuildPartA();
apBuilder->BuildPartB();
}
#include "stdafx.h"
#include "Product.h"
#include <iostream>
void CProduct::Add(string aoStr)
{
m_oParts.push_back(aoStr);
}
void CProduct::Show()
{
list<string>::iterator itor ;
string lstrPart;
for (itor = m_oParts.begin(); itor != m_oParts.end(); itor++)
{
lstrPart = *itor;
cout<<lstrPart<<endl;
}
}
// Builder.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Director.h"
int _tmain(int argc, _TCHAR* argv[])
{
CDirector* lpDirector = NULL;
lpDirector = new CDirector;
CBuilder* lpBuilder1 = new ConCreateBuilder1;
CBuilder* lpBuilder2 = new ConCreateBuilder2;
lpDirector->Construct(lpBuilder1);
CProduct* lpProduct1 = lpBuilder1->GetResult();
lpProduct1->Show();
lpDirector->Construct(lpBuilder2);
CProduct* lpProduct2 = lpBuilder2->GetResult();
lpProduct2->Show();
return 0;
}