zoukankan      html  css  js  c++  java
  • 2.对象创建型模式-抽象工厂

      抽象工厂:提供一个创建一系列相关或相互依赖对象的接口(抽象工厂类),而无需指定他们具体的类。

      抽象工厂模式的实现:1、定义抽象工厂 抽象类MazeFactory以定义一系列创建对象的接口。2、修改客户创建产品的函数,使得该函数可以接收具体工厂类对象,通过抽象工厂方法来创建产品元素对象,避免客户代码对具体类的引用。客户代码仅引用抽象工厂类MazeFactory和抽象产品类Room、Door、Wall。抽象工厂模式在迷宫地图创建中的实现:

    /* 抽象工厂类 */
    class MazeFactory {
    public:
        MazeFactory();
        
        virtual Maze* MakeMaze() const
            { return new Maze(); }     
        virtual Wall* MakeWall() const
            { return new Wall(); }
        virtual Room* MakeRoom(int n) const
            { return new Room(); }
        virtual Door* MakeDoor(Room* r1, Room* r2) const
            { return new Door(r1, r2); }
    };
    
    /* 创建产品的客户代码 */ 
    Maze* MazeGame::CreateMaze(MazeFactory& factory) {
        Maze* aMaze = factory.MakeMaze();
        Room* r1 = factory.MakeRoom(1);
        Room* r2 = factory.MakeRoom(2);
        Door* theDoor = factory.MakeDoor(r1, r2);
        
        aMaze->AddRoom(r1);
        aMaze->AddRoom(r2);
        
        r1->SetSide(North, factory.MakeWall());
        r1->SetSide(East, theDoor);
        r1->SetSide(South, factory.MakeWall());
        r1->SetSide(West, factory.MakeWall());
        
        r2->SetSide(North, factory.MakeWall());
        r2->SetSide(East, factory.MakeWall());
        r2->SetSide(South, factory.MakeWall());
        r2->SetSide(West, theDoor);
    }
    
    /* 创建迷宫地图的客户代码 */
    MazeGame game;
    MazeFactory factory;
    game.CreateMaze(factory);

      总结:1、将具体工厂作为单件,每个产品系列只需要一个ConcreteFactory的实例。2、创建产品,AbstractFactory仅声明创建产品的接口,真正创建产品由ConcreteFactory子类实现。

      抽象工厂模式的效果:

    1、分离了具体的类。一个工厂封装创建产品对象的职责和过程,将客户与类的实现分离

    2、使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次--在初始化的时候,具体工厂类通常实现为单件模式。

    3、它有利于产品的一致性。

    4、难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。

  • 相关阅读:
    HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
    c# 取两个时间的间隔
    [转]C#算法
    智能仓库管理系统方案(四)
    分页存储过程
    ASP.NET2.0_多语言本地化应用程序(转)
    C#绘图双缓冲技术总结(转)
    C#.net同步异步SOCKET通讯和多线程总结(转)
    WIN2003 sp2中Delphi 7中的Project菜单中Options菜单打不开
    C#关于日期月天数和一年有多少周及某年某周时间段的计算
  • 原文地址:https://www.cnblogs.com/VincentXu/p/3344921.html
Copyright © 2011-2022 走看看