3.对象创建型模式-生成器
生成器模式意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
生成器模式实现:1.定义MazeBuilder迷宫地图生成器以封装创建产品使用的构件(具体类)以及产品的内部表示。通过派生新的生成器并使用新的生成器对象,同样的构件过程可以创建不同的产品。
生成器封装了创建产品使用的那些具体类,已经组装具体类对象的细节:
/* 迷宫地图抽象构造器类 */ class MazeBuilder { public: virtual void BuilderMaze() {} virtual void BuilderRoom(int room) {} virtual void BuilderDoor(int roomFrom, int roomTO){} virtual Maze* GetMaze(){ return 0; } protected: /* 构造器函数为protected,目的是MazeBuilder只是借口, * 不应该被实例化 */ MazeBuilder(); }; /* 具体的迷宫地图构造器类 */ class StandardMazeBuilder: public MazeBuilder { public: StandardMazeBuilder(); /* 生成器,可以创建的产品构件 */ virtual void BuilderMaze(); virtual void BuilderRoom(int); virtual void BuilderDoor(int, int); /* 客户使用该接口获取生成器创建的产品 */ virtual Maze* GetMaze(); private: Direction CommonWall(Room*, Room*); Maze* _currentMaze; /*生成器装配的产品*/ } /* 构造器 */ StandardMazeBuilder::StandardMazeBuilder() { _currentMaze = 0; } /* 创建迷宫地图对象 */ void StandardMazeBuilder::BuildMaze() { _currentMaze = new Maze; } /* 获取迷宫产品 */ void StandardMazeBuilder::GetMaze() { return _currentMaze; } /* 往迷宫中添加一个房子构件 */ void StandardMazeBuilder::BuildRoom(int n) { /* 如果当前编号的房子不存在,则创建并添加到迷宫中 */ if (!_currentMaze->RoomNo(n)) { Room* room = new Room(n); _currentMaze->AddRoom(room); room->SetSide(North, new Wall); room->SetSide(South, new Wall); room->SetSide(East, new Wall); room->SetSide(West, new Wall); } } /* 往迷宫中添加其他构件对象的实现类似 */
CreateMaze函数为导向器,导向器只知道创建产品使用了那些构件对象,导向器不知道使用了那些构件具体类以及构件的组装方式:
/* CreateMaze函数相当于创建迷宫的导向器 */ Maze* MazeGame::CreateMaze (MazeBuilder& builder) { builder.BuildMaze(); builder.BuildRoom(1); builder.BuildRoom(2); builder.BuildDoor(1,2); return builder.GetMaze(); }
创建迷宫的客户代码如下:
/* 客户利用StandardMazeBuilder创建迷宫的代码 */ Maze* maze; MazeGame game; StandardMazeBuilder builder; game.CreateMaze(builder);/* 创建产品 */ maze = builder.GetMazee(); /* 获取创建的产品 */
客户通过使用其他的生成器对象,同一个导向器可以生成不同的迷宫地图。
生成器模式与抽象工厂模式的不同点:抽象工厂仅仅封装了创建一个产品使用了那些具体类,而生成器模式不仅封装了创建一个产品使用的构件具体类,还封装了创建产品的方式和细节。