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

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

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

      

  • 相关阅读:
    用SQL完成條件式查詢[收藏From 黃偉榮]
    asp.net代码中尖括号和百分号的含义
    Python读取文本,输出指定中文(字符串)
    nodejs Express 4.x req.body req.query req.params 三种获取参数的方法
    关于ImageMagick出现无效参数(invalid parameter)的解决方法
    JavaScript之数组循环 forEach 循环输出数组元素
    nodejs将PDF文件转换成txt文本,并利用python处理转换后的文本文件
    ImageMagick之PDF转换成图片(image)
    POJ 2635 The Embarrassed Cryptographer(整数刷新,千进制取模)
    js 获取目标网页源码
  • 原文地址:https://www.cnblogs.com/VincentXu/p/3344927.html
Copyright © 2020-2023  润新知