设计模式学习笔记(二)——Build生成器

    技术2022-05-11  70

    二、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来进行不同的生成操作(如例中的CreateMazeCreateComplexMaze)。而导向器的操作大部分使用的是Build中定义的操作,即一步步精细地生成产品(即Maze)。

    Build类是一个抽象类,其中的操作都是空操作。注意不是纯抽象类,故意这么做是为了让Build的子类能够只定义自己感兴趣的操作。

     

    最新回复(0)