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(); /* 获取创建的产品 */

客户通过使用其他的生成器对象,同一个导向器可以生成不同的迷宫地图

  生成器模式与抽象工厂模式的不同点:抽象工厂仅仅封装了创建一个产品使用了那些具体类,而生成器模式不仅封装了创建一个产品使用的构件具体类,还封装了创建产品的方式和细节

  

原文地址:https://www.cnblogs.com/VincentXu/p/3344927.html