RPG游戏中的设计模式之工厂方法模式

这篇博客分析一下游戏中使用到的工厂方法模式,也是这个系列的最后一篇博客了。

工厂方法模式定义

定义了一个创建对象的接口,但由子类决定要实例化哪个类。[1]P162

简而言之,就是由子类决定生产哪个产品

工厂方法的组成部分 – 创建者类,他包含了一个工厂方法,这个工厂方法是核心 – 产品类,就是工厂方法生产的产品

下面还是结合游戏分析一下这个模式

游戏中为什么要用工厂方法模式

所有的角色都有发射子弹的行为FireBehavior,都有个有个Fire()方法用来发射子弹,也就是说这个方法用来生产子弹,而每个角色发射的子弹又互不相同(有MissileOne,MissileTwo,MissileHero等不同子弹),让子类即每个具体角色决定生产什么子弹,也就是由子类决定要实例化哪个类。 这样我们就可以将发射子弹的行为作为创建者类,而Fire()方法作为工厂方法,由Fire()方法来生产子弹,同时由于不同角色生产的子弹不同,所以需要由子类决定生产哪个子弹。这样我们就可以使用工厂方法模式了。

游戏中的创建者与产品

根据上面的分析,我们很容易知道:发射子弹的行为FireBehavior作为创建者类,Fire()方法作为工厂方法,子弹Missiles作为产品

看一下类图:

我们来看一下创建者类

FireBehavior{();}class FireOneMissilesByHero : FireBehavior{public FireOneMissilesByHero(Roles r){this.role = r;}(){if (!role.Live){return;}//生产子弹MissileHeroHitCheck.GetInstance().AddElement(new MissileHero(HitCheck.GetInstance().MyHero, 20, 20, HitCheck.GetInstance().MyHero.Good, MissileDirection.U, 10));}}class FireMissileOneByEnemy:FireBehavior{public FireMissileOneByEnemy(Roles r){this.role = r;}(){//生产子弹MissileOneHitCheck.GetInstance().AddElement(new MissileOne(role, 15, 15, role.Good, Missiles.MissileDirections[FrmMain.enemyRandom.Next(7, 12)], 10));}}

FireOneMissilesByHero和FireMissileOneByEnemy中分别使用HitCheck单例,添加了MissileHero和MissileOne,也就是他们分别生产了MissileHero和MissileOne这两个产品。

以上就是游戏中实现的工厂方法模式,游戏中的工厂方法模式实现的比较简单,关于工厂方法模式和抽象工厂方法模式的深入了解,可以阅读[1]P109~P162中的内容,相信看完了之后,对工厂方法会有一个全新的认识。

结束语

游戏中的单例模式,策略模式和工厂方法模式到这里就全部分析完了,写完这3篇博客,还是觉得非常开心的,算是完成了之前的一个心愿。后面也会写设计模式方面的文章,只不过可能没有这3篇结合游戏写的好,因为设计模式这个东西,只有你去用它,才能够体会到它真正的含义。由于对设计模式理解地还不够深入,分析的过程中必定会存在错误和不足的地方,,欢迎读者批评指正。

参考文献

[1] 《Head First设计模式(中文版)》 ,中国电力出版社 [2] 《设计模式:可复用面向对象软件的基础》(著名的GOF设计模式),机械工业出版社

不义而富且贵,于我如浮云。

RPG游戏中的设计模式之工厂方法模式

相关文章:

你感兴趣的文章:

标签云: