以前一直听说有开发有一些通用的设计模式,可是一直没有详细序研究。 今天拿起K_Eckel(frwei@whu.edu.cn)的《C++模式设计》,开始设计模式的学习。
一.Factory工程模式。
首先,引用CSDN一位前辈总结的几个知识:
- 无论父类里面有没有虚函数,都可以定义指向子类实例的父类指针.
- 如果父类里没有虚函数,则使用父类指针,只能访问父类的成员,而不能访问子类里的成员.
- 如果父类里的虚函数不是纯虚函数,且子类里没有重写该虚函数,则用父类指针访问该虚函数的时候,跟访问父类里的普通函数一样.
- 如果父类里的虚函数不是纯虚函数,且子类里重写了该虚函数,则用父类指针访问该虚函数的时候访问的是子类里重写后的函数.
- 如果父类里的虚函数是纯虚函数,则父类是个抽象类,子类要想能够被实例化,则必须重写该纯虚函数.用父类指针访问该纯虚函数的时候,访问到的是子类里重写了的函数.
- 再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏.
第三,我主要讲我理解Factory模式的应用。
我曾经做过一款手机游戏,游戏中有八种道具,道具有同样的属性:1.在屏幕显示。2.和主角发送碰撞。3.道具的作用。4.道具特有的特点。
在游戏的地图特定的地方会出现道具,但是为了使地图看起来不一样(我对地图的处理还用了另外的方法),每次出现的道具的类别是不确定的。
也就是不确定在特定的地方会出现八种道具的哪一种。这时可以用到factory方法.
//tool.h
class ToolBase
{
public:
ToolBase();
virtual ~ToolBase();
virtual void Action();
virtual int CollisionAction();
virtual void changeDirection();
virtual void InitLevel();
virtual boolean CheckCollision();
public:
int spriteType; //道具类别
int screenX;
int screenY;
int mapX;
int mapY;
int isMegaCatch;
int gradeState;
bool isLose;
bool isHidden;
};
class ToolOne : public ToolBase
{
public:
ToolOne();
~ToolOne();
void Action();
int CollisionAction();
void changeDirection();
void InitLevel();
boolean CheckCollision();
};
class ToolTwo : public ToolBase
{
public:
ToolTwo();
~ToolTwo();
void Action();
int CollisionAction();
void changeDirection();
void InitLevel();
boolean CheckCollision();
};
class ToolThree : public ToolBase
{
public:
ToolThree();
~ToolThree();
void Action();
int CollisionAction();
void changeDirection();
void InitLevel();
boolean CheckCollision();
};
class ToolFour : public ToolBase
{
public:
ToolFour();
~ToolFour();
void Action();
int CollisionAction();
void changeDirection();
void InitLevel();
boolean CheckCollision();
};
class ToolOne : public ToolBase
{
public:
ToolOne();
~ToolOne();
void Action();
int CollisionAction();
void changeDirection();
void InitLevel();
boolean CheckCollision();
};
//这里不再一一列举 不列出具体.cpp的实现
//factory.h
#include "tool"
class ToolFactory:public Factory
{
public:
~ConcreateFactory();
ConcreateFactory();
ToolBase* CreateTool(int toolType);
protected:
private:
};
#include "factory.h"
Factory::Factory()
{
}
Factory::~Factory()
{
}
ToolFactory::ToolFactory()
{
cout << "ConcreteFactory...." << endl;
}
ToolFactory::~ToolFactory()
{
}
ToolBase* ToolFactory::CreateTool(int toolType)
{
if (0 == toolType)
return new ToolOne();
if (1 == toolType)
return new ToolOne();
if (2 == toolType)
return new ToolOne();
if (3 == toolType)
return new ToolOne();
}
到了这里,在读取地图的函数中,读出该道具在地图中相应的位置。然后用获取随机数的函数
//部分实现
Factory fct = new ToolFactory
allTool->toolType = Math_abs(nextInt()%4);
toolBase* tool = CreateTool(allTool->toolType);
//这里就实现了一个道具的随机创建,预先我们并不知道要创建哪个tool类。
这样的好处是,我们不必预先知道tool的种类,在遍历道具时,只需要遍历toolBase的对象指针**allTool就行了。也不必为每一个道具类设定一个指针。
C++的多态帮我们实现了这个效果。
这时我在学习Factory回忆的用法,其实,刚开始我并非这样做。用了一大堆的临时成员来达到了随机的一个效果,效率明显就慢很多。