设计模式(5)-对象创建型模式-Builder模式

来源:互联网 发布:js对联广告 编辑:程序博客网 时间:2024/04/30 20:55

1.1           Builder模式

1.1.1      功能

这个模式的描述在GoF上描述的比较抽象,想做到两点:

1.      创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式:

这句话要分为三个部分来理解:

1).主语缺省为客户程序,是客户程序来创建复杂对象;

2).要独立于该对象的组成部分,需要builder来封装这些组成部分(组件)的实现;

3).要独立于装配方式,需要Director类来封装这些组装方式.

2.  当构造过程必须允许被构造的对象有不同的表示时

       1).对这句话的理解是:builder中的组成部分要允许传入不同的参数从而对同一个组成部分生成不同的对象.

1.1.2      结 构、参与者与协作关系


参与者:

•B u i l d e r

                — 为创建一个P r o d u c t对象的各个部件指定抽象接口。

•C o n c r e t e B u i l d e r

                — 实现Bu i l d e r的接口以构造和装配该产品的各个部件。

                — 定义并明确它所创建的表示。

                — 提供一个检索产品的接口。

•Director

                — 构造一个使用Bu i l d e r接口的对象。

•P r o d u c t

                — 表示被构造的复杂对象。C o n c r e t e B u i l d e r创建该产品的内部表示并定义它的装配过程。

                — 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

  协作


•  客户创建D ir e c t o r对象,并用它所想要的 B u i l d e r对象进行配置。

•  一旦产品部件被生成,导向器就会通知生成器。

•  生成器处理导向器的请求,并将部件添加到该产品中。

•  客户从生成器中检索产品。

1.1.3         例子-C++

                这里例子来自GoF,其中MazeBuilder即builder类,MazeGame即director类,MazeGame的CreateMaze方法即为construct()方法.

                M a z e B u i l d e r类定义了创建各种创建迷宫部件的builder类的接口:

                Class MazeBuilder{                public:                                virtualvoid BuildMaze(){}                                virtualvoid BuildRoom(int room){}                                virtualvoid BuildDoor(int roomFrom,int roomTo){}                                virtualMaze *GetMaze(){return 0;}                protected:                                MazeBuilder();                }                Maze*MazeGame::CreateMaze(MazeBuilder &builder)                {                                builder.BuildMaze();                                builder.BuildRoom(1);                                builder.BuildDoor(1,2);                }

                子类StandardMazeBuilder是一个创建简单迷宫的实现,他将要创建的迷宫放在变量_CurrentMaze中。

Class StandardMazeBuilder : public MazeBuilder{public:                StandardMazeBuilder();                virtualvoid BuildMaze();                virtualvoid BuildRoom(int);                virtualvoid BuildDoor(int,int);                VirtualMaze*GetMaze();Private:                DirectionCommonWall(Room*,Room*);                Maze *_currentMaze;}

客户现在可以使用CreateMaze和StandardMazeBuilder来创建一个迷宫:

Maze *maze;MazeGame game;StandardMazeBuilder builder;game.CreateMaze(builder);Maze=builder.GetMaze();

0 0