创建型模式--生成器

Posted hjx168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型模式--生成器相关的知识,希望对你有一定的参考价值。

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

 

以上是关于创建型模式--生成器的主要内容,如果未能解决你的问题,请参考以下文章

设计模式总结 创建型模式

Builder生成器(创建型模式)

创建型模式—建造者模式

设计模式从青铜到王者第四篇:创建型模式

7创建型模式之建造者模式

「设计模式」创建型