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; } };
原文地址:https://www.cnblogs.com/hjx168/p/12694438.html
时间: 2024-11-09 03:57:01