创建型模式--工厂方法

Posted hjx168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型模式--工厂方法相关的知识,希望对你有一定的参考价值。

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; }

};

 

以上是关于创建型模式--工厂方法的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_工厂方法模式

设计模式 - 创建型模式_工厂方法模式

跟着实例学习设计模式-工厂方法(创建型)

创建型模式之工厂方法模式实例及代码操作

创建型 — 工厂方法模式(Factory Method)

JAVA设计模式(24):创建型-工厂模式工厂方法模式(Factory Method)