C++设计模式学习之Factory模式
来源:互联网 发布:净水器滤芯品牌知乎 编辑:程序博客网 时间:2024/06/16 11:08
以前一直听说有开发有一些通用的设计模式,可是一直没有详细序研究。 今天拿起K_Eckel(frwei@whu.edu.cn)的《C++模式设计》,开始设计模式的学习。
一.Factory工程模式。
首先,引用CSDN一位前辈总结的几个知识:
- 无论父类里面有没有虚函数,都可以定义指向子类实例的父类指针.
- 如果父类里没有虚函数,则使用父类指针,只能访问父类的成员,而不能访问子类里的成员.
- 如果父类里的虚函数不是纯虚函数,且子类里没有重写该虚函数,则用父类指针访问该虚函数的时候,跟访问父类里的普通函数一样.
- 如果父类里的虚函数不是纯虚函数,且子类里重写了该虚函数,则用父类指针访问该虚函数的时候访问的是子类里重写后的函数.
- 如果父类里的虚函数是纯虚函数,则父类是个抽象类,子类要想能够被实例化,则必须重写该纯虚函数.用父类指针访问该纯虚函数的时候,访问到的是子类里重写了的函数.
- 再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏.
第三,我主要讲我理解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回忆的用法,其实,刚开始我并非这样做。用了一大堆的临时成员来达到了随机的一个效果,效率明显就慢很多。
- C++设计模式学习之Factory模式
- 设计模式学习之Factory模式
- 设计模式学习笔记之Factory模式
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- 设计模式之Factory
- proc文件系统功能总览
- PHPDocument 代码注释规范总结
- Linq to Entity 中 , Query不应该有耗时操作
- 31道智力题 考考你的智力(含答案)
- c++学习6之顺序容器
- C++设计模式学习之Factory模式
- strcmp,stricmp,strcmpi,strncmp,strnicmp,strncmpi,strcat,strncat比较
- Bash 实例,第一部分Bourne again shell (bash) 基本编程
- dijkstra,bellman-ford,floyd分析比较
- android中The connection to adb is down,问题和解决 AndroidEclipseAntXML
- Chrome源代码分析之socket(六)
- 快速乘幂
- 如何让电脑带双显示屏,显示不同的内容
- LR监控LINUX资源