创建型模式--生成器

1、意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2、结构

 

3、参与者

Builder——为创建一个product对象的各个部件指定抽象接口;

ConcreteBuilder——实现Builder的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口;

Director——构造一个使用Builder接口的对象;

Product——表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口;

4、适用性

在以下情况可以使用Builder模式

当创建复杂对象的算法应该独立于该对象的组成部分及它们的装配方式时;

当构造过程必须允许被构造的对象有不同的表示时;

5、代码示例

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();
    
};

生成器隐藏了迷宫的内部表示,即定义房间、门和墙壁的那些类,以及这些部件是如何组装成最终的迷宫的。

//创建迷宫, 入参为生成器,利用生成器提供的创建部件的接口,创建部件并组装(由生成器内部自行实现组装,部件的表示及组装方式对用户隐藏)
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.BuildMaze();
    
    builder.BuildRoom(1);
    // ...
    builder.BuildRoom(1001);
    
    return builder.GetMaze();
}

创建标准迷宫的生成器定义:

class StanderMazeBuilder : public MazeBuilder
{
public:
    StanderMazeBuilder();
    
    virtual void BuildMaze();
    virtual void BuildRoom(int);
    virtual void BuildDoor(int, int);
    virtual Maze* GetMaze();
private:
    Direction CommonWall(Room*, Room*);
    Maze* _currentMaze;
};

StanderMazeBuilder::StanderMazeBuilder()
{
    _currentMaze = NULL;
}

void StanderMazeBuilder::BuildMaze()
{
    _currentMaze = new Maze;    
}

Maze* StanderMazeBuilder::GetMaze()
{
    return _currentMaze;
}

void StanderMazeBuilder::BuildRoom(int n)
{
    if (!_currentMaze->Room(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);
    }
}

void StanderMazeBuilder::BuildDoor(int n1, int n2)
{
    Room* r1 = _currentMaze->RoomNo(n1);
    Room* r2 = _currentMaze->RoomNo(n2);
    Door* d = new Door(r1, r2);

    r1->SetSide(CommonWall(r1, r2), d);
    r2->SetSide(CommonWall(r2, r1), d);
}
//创建迷宫
Maze* maze;
MazeGame game;
StanderMazeBuilder builder;
game.CreateMaze(builder);
maze = builder.GetMaze();

 6、总结

  生成器将一个复杂对象的构建与表示分离。一个复杂对象是由多个部件组成,生成器模式把复杂对象的构建和部件构建分别开来,分别用Builder类和Director类表示。Builder类封装了每一个部件的构建方式,Director类负责最后各个部件的精确组装。

posted @ 2020-04-12 22:00  流翎  阅读(147)  评论(0编辑  收藏  举报