C++设计模式-Builder
意图:
将一个复杂的对象的构建与他的表示分离,使得相同的构建过程可以构建出不同的表示
适用:
当创建对象的算法应该独立于该对象的的组成部分以及他们的装配方式时
当相同的构造过程允许构造对象的不同表示时
UML图:

//test.h
//////////////////////////////////////////////////////////////////////////
// 虚拟基类,是所有Builder的基类,提供共同的构建各部分接口函数
class Builder
{
public:
Builder(){}
virtual ~Builder(){}
virtual void BuilderPartA() = 0;
virtual void BuilderPartB() = 0;
};

// 通用的构建产品的基类,根据不同的Builder构建不同的产品
class Director
{
public:
Director(Builder* pBuilder);
~Director();
void Construct();
private:
Builder* m_pBuilder;
};

//产品类,继承自产品基类,并完成各个部分构建的函数
class ConCreateBuilder1 : public Builder
{
public:
ConCreateBuilder1(){}
virtual ~ConCreateBuilder1(){}
virtual void BuilderPartA();
virtual void BuilderPartB();
};
class ConCreateBuilder2 : public Builder
{
public:
ConCreateBuilder2(){}
virtual ~ConCreateBuilder2(){}

virtual void BuilderPartA();
virtual void BuilderPartB();
};

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
#include "test.h"

using namespace std;
//////////////////////////////////////////////////////////////////////////
Director::Director(Builder* pBuilder) : m_pBuilder(pBuilder)
{
}

Director::~Director()
{
delete m_pBuilder;
m_pBuilder = NULL;
}

void ConCreateBuilder1::BuilderPartA()
{
cout << "BuilderPartA by ConCreateBuilder1\n";
}
void ConCreateBuilder1::BuilderPartB()
{
cout << "BuilderPartB by ConCreateBuilder1\n";
}
void ConCreateBuilder2::BuilderPartA()
{
cout << "BuilderPartA by ConCreateBuilder2\n";
}
void ConCreateBuilder2::BuilderPartB()
{
cout << "BuilderPartB by ConCreateBuilder2\n";
}

//通用的构建过程,根据不同的Bulider构建出不同的实例
void Director::Construct()
{
m_pBuilder->BuilderPartA();
m_pBuilder->BuilderPartB();
}
//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
Builder* pBuilder1 = new ConCreateBuilder1;
Director* pDirector = new Director(pBuilder1);
pDirector->Construct();
Builder* pBuilder2 = new ConCreateBuilder2;
Director* pDirector2 = new Director(pBuilder2);
pDirector2->Construct();

delete pDirector;
delete pDirector2;

system("pause");
return 0;
}
将一个复杂的对象的构建与他的表示分离,使得相同的构建过程可以构建出不同的表示
适用:
当创建对象的算法应该独立于该对象的的组成部分以及他们的装配方式时
当相同的构造过程允许构造对象的不同表示时
UML图:

//test.h
//////////////////////////////////////////////////////////////////////////
// 虚拟基类,是所有Builder的基类,提供共同的构建各部分接口函数
class Builder
{
public:
Builder(){}
virtual ~Builder(){}
virtual void BuilderPartA() = 0;
virtual void BuilderPartB() = 0;
};
// 通用的构建产品的基类,根据不同的Builder构建不同的产品
class Director
{
public:
Director(Builder* pBuilder);
~Director();
void Construct();
private:
Builder* m_pBuilder;
};
//产品类,继承自产品基类,并完成各个部分构建的函数
class ConCreateBuilder1 : public Builder
{
public:
ConCreateBuilder1(){}
virtual ~ConCreateBuilder1(){}
virtual void BuilderPartA();
virtual void BuilderPartB();
};
class ConCreateBuilder2 : public Builder
{
public:
ConCreateBuilder2(){}
virtual ~ConCreateBuilder2(){}
virtual void BuilderPartA();
virtual void BuilderPartB();
};
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
#include "test.h"
using namespace std;
//////////////////////////////////////////////////////////////////////////
Director::Director(Builder* pBuilder) : m_pBuilder(pBuilder)
{
}
Director::~Director()
{
delete m_pBuilder;
m_pBuilder = NULL;
}
void ConCreateBuilder1::BuilderPartA()
{
cout << "BuilderPartA by ConCreateBuilder1\n";
}
void ConCreateBuilder1::BuilderPartB()
{
cout << "BuilderPartB by ConCreateBuilder1\n";
}
void ConCreateBuilder2::BuilderPartA()
{
cout << "BuilderPartA by ConCreateBuilder2\n";
}
void ConCreateBuilder2::BuilderPartB()
{
cout << "BuilderPartB by ConCreateBuilder2\n";
}
//通用的构建过程,根据不同的Bulider构建出不同的实例
void Director::Construct()
{
m_pBuilder->BuilderPartA();
m_pBuilder->BuilderPartB();
}
//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
Builder* pBuilder1 = new ConCreateBuilder1;
Director* pDirector = new Director(pBuilder1);
pDirector->Construct();
Builder* pBuilder2 = new ConCreateBuilder2;
Director* pDirector2 = new Director(pBuilder2);
pDirector2->Construct();
delete pDirector;
delete pDirector2;
system("pause");
return 0;
}


Builder()
浙公网安备 33010602011771号