意图:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
构建器模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
构建器和模板方法有类似之处,但并不完全相同;模板方法针对的是一个算法中部分步骤是变化,需要重写;而构建器算法步骤是稳定的,但是每个对象的各个步骤经常发生变化。
假设有一个类负责房屋建筑:
class House{
public:
void Init()
{
this->BuildFloor();
for(int i = 0; i < 4; ++i) {
this->BuildWalls();
}
this->BuildDoor();
this->BuildWindows();
this->BuildRoof();
}
virtual ~House(){}
protected:
virtual void BuildFloor() = 0;
virtual void BuildWalls() = 0;
virtual void BuildDoor() = 0;
virtual void BuildWindows() = 0;
virtual void BuildRoof() = 0;
};
现在需要建筑一个石头房屋:
class StoneHouse:public House{
protected:
virtual void BuildFloor()
{
}
virtual void BuildWalls()
{
}
virtual void BuildDoor()
{
}
virtual void BuildWindows()
{
}
virtual void BuildRoof()
{
}
};
至此,构建器模式就已经实现了。但是呢,实际上还是有优化空间的,比如House这个类还有其他的成员和函数,那么一大串的Init函数会让这个类很“臃肿”,那么还可以继续优化,将Init函数部分独立成一个类,专注于构建房屋方法:
class House{
//。。。
};
class HouseBuilder{
public:
House* GetResult()
{
return pHouse;
}
virtual ~HouseBuilder(){}
protected:
House* pHouse;
virtual void BuildFloor() = 0;
virtual void BuildWalls() = 0;
virtual void BuildDoor() = 0;
virtual void BuildWindows() = 0;
virtual void BuildRoof() = 0;
};
class StoneHouse:public House{
};
class StoneHouseBuilder: public HouseBuilder{
protected:
virtual void BuildFloor()
{
}
virtual void BuildWalls()
{
}
virtual void BuildDoor()
{
}
virtual void BuildWindows()
{
}
virtual void BuildRoof()
{
}
};
class HouseDirector{
public:
HouseBuilder* pHouseBuidler;
HouseDirector(HouseBuiler* _pHouseBuilder)
{
this->pHouseBuilder = _pHouseBuilder;
}
House* Constructor(){
pHouseBuilder->BuildFloor();
for(int i = 0; i < 4; ++i) {
pHouseBuilder->BuildWalls();
}
pHouseBuilder->BuildDoor();
pHouseBuilder->BuildWindows();
pHouseBuilder->BuildRoof();
return pHouseBuilder->GetResult();
}
};
int main()
{
HouseBuilder* pHouseBuilder = new StoneHouseBuilder();
HouseDirector pHouseDirector(pHouseBuilder);
House* pHouse = pHouseDirector.Constructor();
delete pHouseBuilder;
return 0;
}
网友评论