#include "stdafx.h"
class Wall{
public:
Wall(){
printf("Wall/n");
}
};
class Room{
public:
Room(){
printf("Room/n");
}
};
class Door{
public:
Door(){
printf("Door/n");
}
};
class MazeGame
{
public:
virtual void CreateMaze(){
MakeWall();
MakeRoom();
MakeDoor();
}
virtual Wall* MakeWall(){
//printf("MazeGame_CreateWall!/n");
return new Wall;
}
virtual Room* MakeRoom(){
//printf("MazeGame_CreateRoom!/n");
return new Room;
}
virtual Door* MakeDoor(){
//printf("MazeGame_CreateRoom!/n");
return new Door;
}
};
class EnchantedWall:public Wall{
public:
EnchantedWall(){
printf("EnchantedWall/n");
}
};
class EnchantedRoom:public Room{
public:
EnchantedRoom(){
printf("EnchantedRoom/n");
}
};
class EnchantedMazeGame:public MazeGame
{
Wall* MakeWall(){
return new EnchantedWall;
};
Room* MakeRoom(){
return new EnchantedRoom;
};
};
int main(int argc, char* argv[])
{
printf("The original mazegame!/n");
MazeGame mazegame;
mazegame.CreateMaze();
printf("/n/nThe enchanted mazegame!/n");
EnchantedMazeGame enchantedmazegame;
enchantedmazegame.CreateMaze();
return 0;
}
运行结果如下:
结论:验证了
1、 在创建子类的对象之前,总是会先遍历调用该子类所有父类的构造函数,然后再调用该子类的构造函数。
2、可以看到 虽然子类中CreateMaze没有被重载,但是由于其内部的一些引用的成员函数(这里是MakeWall()、MakeRoom())被子类重载了。在执行子类中的CreateMaze函数时,系统能够自动识别的调用这些子类中的相同函数名的函数。
这个程序里的工厂模式的意义是:如果需要重新生成一个对象,只需要将最上端的工厂的子类ConcretFactory更改即可。因为其作为工厂类的接口都是一样的。
在实现这些工厂的时候,通过子类的重载抽象类中的生成各种产品Product(部分对象)的函数ConcretProduct,可以更改最终创建的对象,即产品。
这里ConreteFactory和ConcretProduct可以看到是一个平行的结构?
结构图如下
对照程序我们可以看到
Product 即为 Wall
ConcreteProduct 即为 EnchantedWall
Creator 即为MazeGame
ConcreteCreator即为EnchantedMazeGame
FactoryMethod 即为 return new EnchantedWall。
通过FactoryMethod将这个生成Product的操作屏蔽。从外观上来看也即使相同的接口,只是不同的工厂MazeGame的不同子类而已。
自己觉得:理解设计模式可能从Client的code形式,然后回溯到设计模式的实现,这条思路来理解会更加清晰一些。
如果本文有什么错误或者有什么好的建议,希望大家能够及时指出,谢谢。