【适用性】
(1)当一个类不知道它所必须创建的对象的类的时候;
(2)当一个类希望由它的子类来指定它所创建的对象的时候;
(3)当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
【引用】FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
【代码示范】
请先参考Abstract Factory中关于MazeGame函数的定义
修改MazeGame函数如下:
class MazeGame{
public:
Maze* CreateMaze();
virtual Maze* MakeMaze()const{
returnnew Maze;
}
virtual Wall* makeWall()const{
returnnew Wall;
}
virtual Room* makeRoom(int n)const{
returnnew Room(n);
}
virtual Door* makeDoor(Room* r1, Room* r2)const{
returnnew Door(r1,r2);
}
};
Maze* MazeGame::CreateMaze()
{
Maze* aMaze = MakeMaze();
Room* r1 = MakeRoom(1);
Room* r2 = MakeRoom(2);
Door* aDoor = MakeDoor (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 (MakeWall());
r2->setSide (MakeWall ());
r2->setSide (MakeWall ());
r2->setSide (West,aDoor);
return aMaze;
}
class BomedMazeGame : public MazeGame{
BomedMazeGame();
virtual Wall* MakeWall()const{
returnnew BomedWall;
}
virtual Room* MakeRoom(int n)const{
returnnew RoomWithABomb(n);
}
};
【解释】类BomedMazeGame继承基类MazeGame,自己重新定义了函数MakeWall、MakeRoom覆盖基类的虚函数MakeWall、MakeRoom,继承父类函数CreateMaze(),像 r2->setSide (MakeWall());
这样的语句,MakeWall用的就是子类的定义。