Loki库研究-Factory,AbstractFactory

上个星期, 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>();

posted on 2007-11-05 08:06 Randy 阅读(761) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜