Factory模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。
/*
* file: Factory.h
* brief: Created by night at 2014.04.16
*/
#ifndef __FACTORY_H__
#define __FACTORY_H__
#include "Singleton.h"
//#include "Entity.h"
class Entity
{
// ...
}
bool IsPlayer(int id) {
return id < 65536;
}
bool IsNPC(int id) {
return id > 65536 && id < 131072;
}
bool IsMonster(int id) {
return id > 131072 && id < 196608;
}
class EntityFactory : public Singleton
{
public:
EntityFactory();
~EntityFactory();
virtual Entity* CreateEntity(int id);
Entity* CreatePlayer();
Entity* CreateNPC();
Entity* CreateMonster();
};
#endif
/*
* file: Factory.cpp
* brief: Created by night at 2014.04.16
*/
#include "Factory.h"
Entity* EntityFactory::CreateEntity(int id)
{
if (IsPlayer(id))
return EntityFactory::Instance()->CreatePlayer(id);
else if (IsNPC(id))
return EntityFactory::Instance()->CreateNPC(id);
else if (IsMonster(id))
return EntityFactory::Instance()->CreateMonster(id);
return null;
}
Entity* EntityFactory::CreatePlayer(int id)
{
}
Entity* EntityFactory::CreateNPC(int id)
{
}
Entity* EntityFactory::CreateMonster(int id)
{
}
利用Factory模式,可以很方便的扩展或者修改Factory生产的产品。比如:
class MyEntityFactory : public EntityFactory
{
public:
Entity* CreateEntity(int id);
Entity* CreateRobot(int id);
}
Entity* MyEntityFactory::CreateEntity(int id)
{
if (IsPlayer(id))
return EntityFactory::Instance()->CreateNPC(id);
else if (IsNPC(id))
return EntityFactory::Instance()->CreateMonster(id);
else if (IsRobot(id))
return MyEntityFactory::Instance()->CreateRobot(id);
// ...
return EntityFactory::Instance()->CreateEntity(id);
}
PS. 我的设计模式系列blog, 《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。