二、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的子类能够只定义自己感兴趣的操作。