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

posted on 2013-09-28 23:25  黑猫警长V5  阅读(416)  评论(0编辑  收藏  举报

导航