上个星期, ric和我提出了这样一个问题,就是一个人物技能体系,如何设定,比较原始的方法是,设立一个纯虚基类,然后一层一层的派生,但是这样有一个问题..就是如何出现两个不同的派生体系对同一功能需求.这样...就只能在两个派生体系中都设定一份..造成代码的无复用和庞大.虽然这点可以在前期避免,但是没有人是神......前期构架无法得到最后的结构,构架总是在调整,我第一次提出的方法是..将每有功能以组件形式提供,在相应的功能需求者里组装,这个思路是可以..但是实现起来有点郁闷,因为我不知道是用单纯的类new...还是使用单件来做更好,相反,,我到是觉得这两种都不好.
带着这样的需求和思路,去研究了一下Loki的Factory,AbstractFactory 类厂与抽象类厂.
Factoy可以理解为一个可以保存类的表,通过Register方法,将类以数字或字符的形式,保存起来,当然需要提供一个可以在内部new的函数.在使用用通过
在注册时的类标示,加上CreateObject方法来返回相应的类指针,其实就相当于一个类表.我们可以通过我们自定义的标示来创建相对应的类.
AbstractFactory 可以理解为抽象的类表,就是在前期不需要提供相应的可以在内部new的函数,只需要提供类就可以注册为一个类厂,在使用时.通过类来进行创建,最大的区别是...AbstractFactory 本身就提供组装的概念.可以在设定基本工厂之后,根据基本工厂,设定具体工厂模型.在使用时,可以通过具体工厂模型得到在具体工厂模型中注册的类,最大的区别时,,可以通过注册类的基类.也就是基本工厂中注册类来得到.这样很爽..但是.还没有想清楚在真正的人物技能体系中,如何去使用这个东东.偶滴神啊......让偶想清楚吧...下面给些具体的例子
factory:
Factory< AbstractProduct, int > aFactory;
aFactory.Register( 1, createProductNull );<br>
aFactory.CreateObject( 1 );
AbstractFactory:
typedef ::Loki::AbstractFactory< LOKI_TYPELIST_3(Soldier, Monster, SuperMonster)> \
AbstractEnemyFactory;
typedef ::Loki::ConcreteFactory<AbstractEnemyFactory, ::Loki::OpNewFactoryUnit, \
LOKI_TYPELIST_3(SillySoldier, SillyMonster, SillySuperMonster)>
EasyLevelEnemyFactory;
typedef ::Loki::ConcreteFactory<AbstractEnemyFactory, ::Loki::OpNewFactoryUnit, \
LOKI_TYPELIST_3(BadSoldier, BadMonster, BadSuperMonster)>
DieHardLevelEnemyFactory;
switch (id)
{
case 0:
{
pFactory = new EasyLevelEnemyFactory;
}
break;
case 1:
{
pFactory = new DieHardLevelEnemyFactory;
}
break;
}
the.Select(0);
SmartPtr<Soldier>::Ptr pMonster = the.pFactory->Create<Soldier>();