建造者模式
定义:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
使用场景:当一个类的构造函数参数个数超过四个,而这些参数有些是可选参数,考虑使用建造者模式。
项目例子
假设有一个程序需要画一个小人,包括头、身体、两手、两脚构成即可。可以创建一个类表示该小人:
class people{
people(){
//创建头
//创建身体
//创建双手
//创建双腿
}
};
但是当需求增加时,譬如,需要创建一个胖子、瘦子、高个、矮个时,其各个部分的构造函数需要适应性改变,如果各种人都创建一个类时,容易出现编程错误,譬如,某个类缺少某个创建过程了。
此时,需要将创建过程抽象出来,不能让任何人遗忘某一过程的创建。
//PeopleBuilder.h
#pragma once
class PeopleBulider{
public:
virtual void setHead() = 0;
virtual void setBody() = 0;
virtual void setHands() = 0;
virtual void setLegs() = 0;
}
如上为“Builder”角色。
如果想要构造一个“瘦子”的角色,则继承上述即可。
//ThinPeopleBuilder.h
#pragma once
#include "PeopleBulider.h"
class ThinPeopleBulider :public PeopleBulider
{
public:
ThinPeopleBulider(void);
~ThinPeopleBulider(void);
void setHead();
void setBody();
void setHands();
void setLegs();
};
//ThinPeopleBuilder.cpp
#include "StdAfx.h"
#include "ThinPeopleBulider.h"
ThinPeopleBulider::ThinPeopleBulider(void)
{
}
ThinPeopleBulider::~ThinPeopleBulider(void)
{
}
void ThinPeopleBulider::setHead()
{
//瘦子
}
void ThinPeopleBulider::setBody()
{
//瘦子
}
void ThinPeopleBulider::setHands()
{
//瘦子
}
void ThinPeopleBulider::setLegs()
{
//瘦子
}
如上为“ConcreteBuilder”角色。
此时,可以构建一个类,用来组装人物:
//Director.h
#pragma once
#include "PeopleBulider.h"
class Director
{
public:
Director(PeopleBulider *);
~Director(void);
void Construct();
private:
PeopleBulider *_bld;
};
//Director.cpp
#include "StdAfx.h"
#include "Director.h"
Director::Director(PeopleBulider *p)
{
_bld = p;
}
Director::~Director(void)
{
}
void Director::Construct()
{
_bld->setHead();
_bld->setBody();
_bld->setHands();
_bld->setLegs();
}
如上为“Director”角色。
而最终使用方式为:
// BuilderTest.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "Director.h"
#include"ThinPeopleBulider.h"
int _tmain(int argc, _TCHAR* argv[])
{
ThinPeopleBulider *t_thinPeople = new ThinPeopleBulider();
Director t_director(t_thinPeople);
t_director.Construct();
return 0;
}