二、Build(生成器)
情景举例:
创建一个可重用的建造迷宫程序。
代码示例:
/* 用非抽象类来让客户只定义自己感兴趣的操作
*/
class MazeBuilder {
public:
virtual void BuildMaze() { }
virtual void BuildRoom(int room) { }
virtual void BuildDoor(int roomFrom, int roomTo) { }
virtual Maze* GetMaze() { return 0; }
protected:
MazeBuilder();
};
/* 使用MazeBuilder来一步一步创建一个Maze
*/
Maze* MazeGame::CreateMaze (MazeBuilder& builder) {
builder.BuildMaze();
builder.BuildRoom(1);
builder.BuildRoom(2);
builder.BuildDoor(1, 2);
return builder.GetMaze();
}
/* 可以重用MazeBuilder来创建不同种类的迷宫
*/
Maze* MazeGame::CreateComplexMaze (MazeBuilder& builder) {
builder.BuildRoom(1);
// ...
builder.BuildRoom(1001);
return builder.GetMaze();
}
/* MazeBuilder子类,重新定义其操作
*/
class StandardMazeBuilder : public MazeBuilder {
public:
StandardMazeBuilder();
/*
*/
virtual void BuildMaze();
virtual void BuildRoom(int);
virtual void BuildDoor(int, int);
/*
*/
virtual Maze* GetMaze();
private:
Direction CommonWall(Room*, Room*);
Maze* _currentMaze;
};
/* 在主程序调用CreateMaze,以StandardMazeBuilder为参数
*/
Maze* maze;
MazeGame game;
StandardMazeBuilder builder;
maze = game.CreateMaze(builder);
个人理解:
MazeBuild为生成器,MazeGame为使用生成器的导向器,导向器可以重复使用Build来进行不同的生成操作(如例中的CreateMaze和CreateComplexMaze)。而导向器的操作大部分使用的是Build中定义的操作,即一步步精细地生成产品(即Maze)。
Build类是一个抽象类,其中的操作都是空操作。注意不是纯抽象类,故意这么做是为了让Build的子类能够只定义自己感兴趣的操作。