《王者荣耀》中程序24种设计模式之奥义第二式·工厂方法模式

277 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

由来

当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢?
这时恭喜您进入转职阶段,由码农转成会放魔法的码农。。。(多么吊炸天技能)
觉醒吧!少年。
以王者荣耀为示例题材,写代码就是打游戏!

上一篇:简单工厂模式

简单工厂模式:juejin.cn/post/708859…

入口

代码示例裢接:github.com/ruanch/Desi…

进入正题(再造一个英雄库

写这个模式的目的是为什么,简单工厂和工厂方法的区别是什么。 
简单工厂模式最大的优点在于工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
但是违背了开放-封闭原则(在文章最后给出解释)

看一下工厂方法的实现英雄库实例
首先角色库的实例代码都不变,NSRoleNSAkeRoleNSGuanYuRoleNSXiaoQiaoRole、NELvBuRole
现在扩展一下工厂类,将工厂抽出变成一个抽象工厂然后根据要生成的角色生成不同的角色工厂
*** 抽象类:***
//角色工厂
class NERoleFactory_FM: NSObject {

    func createFactory() -> NERole_FM{

        return NERoleAKe_FM()

    }

}

***具体实现类:***
//阿珂角色工厂
class NERoleAKeFactory_FM: NERoleFactory_FM {

    override func createFactory() -> NERole_FM{

        return NERoleAKe_FM() //返回具体角色实例

    }

}

***//关羽角色工厂***
class NERoleGuanYuFactory_FM: NERoleFactory_FM {

    override func createFactory() -> NERole_FM{

        return NERoleGuanYu_FM()

    }

}
***......***(其它类似)

***接下来看下,如何在客户端里调用:***
//创建阿珂工厂
let akeFactory = NERoleAKeFactory_FM()

//工厂造角色

var akeRole = akeFactory.createFactory()

//给角色一此基础信息

akeRole.name = "阿珂"

akeRole.healthPoint = 100.0

akeRole.magicPoint = 50.0

akeRole.price = 13888.0

//执行具体动作

print(akeRole .getRoleInfo())

\


//创建关羽工厂

let guanYufactory = NERoleGuanYuFactory_FM()

//工厂造角色

var guanYuRole = guanYufactory.createFactory()

//给角色一此基础信息

guanYuRole.name = "关羽"

guanYuRole.healthPoint = 150.0

guanYuRole.magicPoint = 30.0

guanYuRole.price = 18888.0

//执行具体动作

print(guanYuRole .getRoleInfo())

总结

如果你跟上面简单工厂对比一下,客户端的实现,会发现创建的实例的代码已经从工厂里移到客户端上面,
所以相比简单工厂,增加一个新的实体角色只需要增加相应工厂类和实体类,以及这边的增加代码增加,达到不用修改工厂类。
但是还是有一个问题能不能不改客户端代码,答案当然是:可以!利用反射机制来处理。

上一下工厂方法模式关系图

image.png

下一篇

《王者荣耀》中程序24种设计模式之奥义第三式·抽象工厂模式:juejin.cn/post/708998…