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

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

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





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






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值