C++设计模式学习之Factory模式

来源:互联网 发布:净水器滤芯品牌知乎 编辑:程序博客网 时间:2024/06/16 11:08

 以前一直听说有开发有一些通用的设计模式,可是一直没有详细序研究。 今天拿起K_Eckel(frwei@whu.edu.cn)的《C++模式设计》,开始设计模式的学习。
 
 一.Factory工程模式。
首先,引用CSDN一位前辈总结的几个知识:

    1. 无论父类里面有没有虚函数,都可以定义指向子类实例的父类指针.
    2. 如果父类里没有虚函数,则使用父类指针,只能访问父类的成员,而不能访问子类里的成员.
    3. 如果父类里的虚函数不是纯虚函数,且子类里没有重写该虚函数,则用父类指针访问该虚函数的时候,跟访问父类里的普通函数一样.
    4. 如果父类里的虚函数不是纯虚函数,且子类里重写了该虚函数,则用父类指针访问该虚函数的时候访问的是子类里重写后的函数.
    5. 如果父类里的虚函数是纯虚函数,则父类是个抽象类,子类要想能够被实例化,则必须重写该纯虚函数.用父类指针访问该纯虚函数的时候,访问到的是子类里重写了的函数.
    6. 再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏.
第二,Factory模式的模型图。





第三,我主要讲我理解Factory模式的应用。
我曾经做过一款手机游戏,游戏中有八种道具,道具有同样的属性:1.在屏幕显示。2.和主角发送碰撞。3.道具的作用。4.道具特有的特点。
在游戏的地图特定的地方会出现道具,但是为了使地图看起来不一样(我对地图的处理还用了另外的方法),每次出现的道具的类别是不确定的。
也就是不确定在特定的地方会出现八种道具的哪一种。这时可以用到factory方法.

//tool.hclass 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回忆的用法,其实,刚开始我并非这样做。用了一大堆的临时成员来达到了随机的一个效果,效率明显就慢很多。






原创粉丝点击