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、难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。

  • 相关阅读:
    语义分割之BiSeNet
    语义分割之ENet, LinkNet
    语义分割之DFN
    语义分割之GCN
    语义分割之DeepLab系列
    语义分割之SegNet
    语义分割之U-Net和FusionNet
    语义分割之FCN
    pytorch,python学习
    CV baseline之SENet
  • 原文地址:https://www.cnblogs.com/VincentXu/p/3344921.html
Copyright © 2011-2022 走看看