码迷,mamicode.com
首页 > 其他好文 > 详细

创建型模式--工厂方法

时间:2020-04-13 22:52:44      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:帮助   代码   sid   product   span   必须   game   class   技术   

1、意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

2、结构

技术图片

 

 3、参与者

Product——定义工厂方法所创建对象的接口。

ConcreteProduct——实现Product接口

Creator——声明工厂方法,该方法返回一个Product类型对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。

ConcreteCreator——重定义工厂方法以返回一个ConcreteProduct实例。

4、适用性

在下列情况下可以使用工厂方法模式:

当一个类不知道它所必须创建的对象的类的时候;

当一个类希望由它的子类来指定它所创建的对象的时候;

当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类时代理者这一信息局部化的时候。

5、代码示例

//迷宫,在MzaeGame中定义创建迷宫,房间、墙壁和门的工厂方法,每一个工厂方法返回一个给定类型的迷宫构件
class MazeGame
{
public:
    Maze* CreateMaze();
    
    //factory method:
    virtual Maze* MakeMaze() const
        { return new Maze(); }
    virtual Room* MakeRoom(int n) const
        { return new Room(n); }
    virtual Wall* MakeWall() const
        { return new Wall; }
    virtual Door* MakeDoor() const
        { return new Door; }
};
//使用工厂方法构建迷宫
Maze* MazeGame::CreateMaze()
{
    Maze* aMaze = MazeMaze();
    Room* r1 = MazeRoom(1);
    Room* r2 = MazeRoom(2);
    Door* aDoor = MazeDoor(r1, r2);
    
    aMaze->AddRoom(r1);
    aMaze->AddRoom(r2);
    
    r1->SetSide(North, MakeWall());
    r1->SetSide(East, aDoor);
    r1->SetSide(South, MakeWall());
    r1->SetSide(West, MakeWall());
    r2->SetSide((North, MakeWall());
    r1->SetSide(East, MakeWall());
    r1->SetSide(South, MakeWall());
    r1->SetSide(West, aDoor);
    
    return aMaze;
}
//重定义工厂方法以返回特定的实例
class BombedMazeGame : public MazeGame
{
public:
    BombedMazeGame();
    
    //factory method:

    virtual Room* MakeRoom(int n) const
        { return new RoomWithABomb(n); }
    virtual Wall* MakeWall() const
        { return new BombedWall; }

};

 

创建型模式--工厂方法

标签:帮助   代码   sid   product   span   必须   game   class   技术   

原文地址:https://www.cnblogs.com/hjx168/p/12694438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!