建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示:
《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构
对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。
代码示例:
// 建造者模式2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class Men
{
public:
void SetBody(int param)
{
m_nBody = param;
}
void SetEye(int param)
{
m_nEye = param;
}
void SetFoot(int param)
{
m_nFoot = param;
}
void show()
{
printf("body:%d\neye:%d\nfoot:%d\n",m_nBody,m_nEye,m_nFoot);
}
private:
int m_nBody;
int m_nEye;
int m_nFoot;
};
class BaseBuilder
{
public:
virtual void CreateMen() = 0;
virtual void BuildBody(int param) = 0;
virtual void BuildEye(int param) = 0;
virtual void BuildFoot(int param) = 0;
virtual Men* GetMen() = 0;
};
class FatBuilder : public BaseBuilder
{
public:
void CreateMen()
{
printf("create a fatter!!\n");
m_men = new Men();
}
void BuildBody(int param)
{
m_men->SetBody(param);
}
void BuildEye(int param)
{
m_men->SetEye(param);
}
void BuildFoot(int param)
{
m_men->SetFoot(param);
}
Men* GetMen()
{
return m_men;
}
protected:
private:
Men * m_men;
};
class ThinBuilder : public BaseBuilder
{
public:
void CreateMen()
{
printf("create a thiner!!\n");
m_men = new Men();
}
void BuildBody(int param)
{
m_men->SetBody(param);
}
void BuildEye(int param)
{
m_men->SetEye(param);
}
void BuildFoot(int param)
{
m_men->SetFoot(param);
}
Men* GetMen()
{
return m_men;
}
protected:
private:
Men * m_men;
};
class Director
{
public:
Director(BaseBuilder* base)
{
m_baseBuilder = base;
}
void BuilderMen()
{
m_baseBuilder->CreateMen();
m_baseBuilder->BuildBody(501);
m_baseBuilder->BuildEye(502);
m_baseBuilder->BuildFoot(503);
}
public:
BaseBuilder* m_baseBuilder;
};
int main(int argc, char* argv[])
{
// Men* men2 = new Men();
// men2->SetBody(100);
// men2->SetEye(200);
// men2->SetFoot(300);
// men2->show();
Director* director = NULL;
BaseBuilder* base = NULL;
Men* men = NULL;
base = new FatBuilder();
director = new Director(base);
director->BuilderMen();
men = base->GetMen();
men->show();
printf("Hello World!\n");
base = new ThinBuilder();
director = new Director(base);
director->BuilderMen();
men = base->GetMen();
men->show();
printf("Hello World!\n");
return 0;
}
结果:
create a fatter!!
body:501
eye:502
foot:503
Hello World!
create a thiner!!
body:501
eye:502
foot:503
Hello World!
Press any key to continue