建造者模式实际上是常用的设计模式。顾名思义,builder的意思是建造者或者建筑工人,谈到建造自然会想到楼房。楼房是千差万别的,楼房的外形、层数、内部房间的数量、房间的装饰等等都不一样,但是对于建造者来说,抽象出来的建筑流程是确定的,往往建筑一座楼房包括下面的步骤:(1)打桩,建立基础(2)建立框架等。建造者模式的本质和建造楼房是一致的:即流程不变,但每个流程实现的具体细节则是经常变化的。建造者模式的好处就是保证了流程不会变化,流程即不会增加、也不会遗漏或者产生流程次序错误,这是非常重要的。
生活中有着很多的Builder的例子,个人觉得大学生活就是一个Builder模式的最好体验:要完成大学教育,一般将大学教育过程分成4个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这4年的(4个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。
Builder模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式通常包括下面几个角色:
1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product:要创建的复杂对象。
建造者模式的结构图:
下面给出部分样例代码,全部代码请访问GitHub:
Builder.h
#ifndef _BUILDER_H
#define _BUILDER_H
/// common base class CBuilder
class CPage;
class CBuilder{
protected:
CBuilder(){}
public:
virtual voidBuildPage(){}
virtual voidBuildTitle() {}
virtual voidBuildBar() {}
virtual voidBuildButton() {}
virtual voidBuildMenu() {}
virtual CPage*GetPage() { return 0; }
};
class CDerivedBuilder1 : public CBuilder{
public:
virtual voidBuildPage();
virtual voidBuildTitle();
virtual voidBuildBar();
virtual voidBuildButton();
virtual voidBuildMenu();
virtual CPage*GetPage();
private:
CPage* m_page;
};
#endif
Director.h
#ifndef _DIRECTOR_H
#define _DIRECTOR_H
class CBuilder;
class CPage;
class CPageDirector{
public:
CPageDirector(CBuilder*builder);
CPage*CreatePage();
private:
CBuilder* m_builder;
};
#endif
Products.h
#ifndef _PRODUCTS_H
#define _PRODUCTS_H
#include <vector>
namespace{
#defineMAX_PAGE_SIZE 10;
}
/// common base class
class CFrame
{
public:
virtual voidDraw() = 0;
};
/// class title
class CTitle : public CFrame
{
public:
virtual voidDraw();
};
class CTextTitle : public CTitle
{
public:
virtual voidDraw();
};
class CImageTitle : public CTitle
{
public:
virtual voidDraw();
};
/// class menu
class CMenu : public CFrame
{
public:
virtual voidDraw();
};
class CListMenu : public CMenu
{
public:
virtual voidDraw();
};
class CTreeMenu : public CMenu
{
public:
virtual voidDraw();
};
/// class button
class CButton : public CFrame{
public:
virtual voidDraw();
};
class CTextButton : public CButton
{
public:
virtual voidDraw();
};
class CImageButton : public CButton
{
public:
virtual voidDraw();
};
/// class bar
class CBar : public CFrame{
public:
virtual voidDraw();
};
class CToolBar : public CBar
{
public:
virtual voidDraw();
};
class CProgressBar : public CBar
{
public:
virtual voidDraw();
};
/// class page
class CPage : public CFrame{
public:
virtual voidDraw();
voidAddFrames(CFrame* pFrame);
private:
std::vector<CFrame*>m_vecFrames;
};
class CSlidePage : public CPage
{
public:
virtual voidDraw();
};
class CEditPage : public CPage
{
public:
virtual voidDraw();
};
#endif