回顾游戏中的设计模式:策略模式vs抽象工厂



最近有时间看看设计模式方面的书,好多东西时间久了不看就变得生疏起来, 在这里会抽出时间把自己在工作中使用过的设计模式做下总结。

刚才在看到别人说,简单工厂模式是“通过提供单独的一个类,来实现创建实例对象的过程”,可以使用反射来替换掉程序中的switch/if..else,嗯,这是没问题的,但实际应用中,在移动端还要尽量少的去频繁使用反射Reflection,严重依赖字符串的功能都会存在效率的问题。

今天在看到策略模式(Strategy Pattern)的时候,突然间意识到自己在16年的一个项目中,有一处应用不够合理。

当时在存储游戏数据部分,我是通过直接将对象图转化成字节流的形式,即序列化。

那么序列化有多种方式,你可以序列化成XML,也可以是二进制,或者是SOAP(类似于XML,不建议使用,只是为了多提供一个策略演示)。

那么这时候,采用哪种设计模式?

当时使用的是抽象工厂,但实际上,他更符合策略模式。即我们将多个“策略”抽象成接口的形式来解耦合。

比如说我要回大连,我可以坐火车,飞机,客车,或是自驾。我最终的目的是相同的,只是到达目的的方式不同。

然而在代码上,策略模式和抽象工厂区别不是很大,后来我搜索了一下关于两个设计模式之间的区别,找到了一个非常好的解释 。

2009年的一个帖子。解释如下:

抽象工厂属于创建型的,而策略模式属于行为型。

抽象工厂往往是抽取的同一基类(Class)的不同子类。

策略模式往往抽取的是同一接口的不同实现。

那么显然,我在序列化的时候,我序列化为哪种格式,只是行为不同(纯行为上),结果相同,而且也符合同一接口的不同实现。

那么说到这里了,就把之间的代码给修改一下,修改为策略模式。

定义序列化接口:

ISerializable.cs



声明了两个方法,序列化和反序列化。

下面实现具体的序列化类,分别是Binary,XML,SOAP

BinarySerialized.cs



XMLSerialized .cs



SOAPSerialized.cs(SOAP要引入dll[System.Runtime.Serialization.Formatters.Soap.dll])



最后我们定义一个序列化的上下文,面向接口编程:

SerializableContext.cs



演示代码:



在这里定义了一个DataManager类,DataManager包含了



两个字段,并进行初始化,然后对DataManager类,进行序列化和反序列化测试。



演示代码下载(微云):

https://share.weiyun.com/5Cg9MT4


来源:微信公众号“游戏扶持by腾讯游戏学院”
原地址:https://mp.weixin.qq.com/s/LGrmh74BaRN3T0xHaZPycA

程序员专用的几个高质量 Chrome 插件

当然,就是从提高自己的效率开始,为自己减轻压力,节省更多时间去做别的事。今天我就给大家推荐几个,我个人感觉用的不错的,能够提高效率的,而且是有关程序员工作使用的Chrome浏览器插

PHP和Python如何选择?或许可以考虑这三个问题

文/黄小天、李亚洲 (选自ackernoon 机器之心编译) 年可谓是网页应用与 之年,开发者不用每次重新发明轮子,而是利用脚手架和第三方库就能确保项目在几天内实时部署。尽管 ful 和跨平台库已经使网页开发容易起来,但依然没有解决阻碍并隔分开发者、管

JavaScript中的内存管理

使用具备垃圾收集机制的语言编写程序,开发人员一般不必关心内存管理的问题。但是,JavaScript在进行内存管理及垃圾收集时面临的问题还是有点与众不同的。

回顾游戏中的设计模式:策略模式vs抽象工厂

最近有时间看看设计模式方面的书,好多东西时间久了不看就变得生疏起来, 在这里会抽出时间把自己在工作中使用过的设计模式做下总结。刚才在看到别人说,简单工厂模式是“通过提供单独的一个类,来实现创建实例对象的过程”,可以使用反射来替换掉程序中的switch/if

什么是独立游戏?独立VS商业(欢迎来参与讨论)

由在读的开发者李姬韧创作的文章,内容丰富,亮点颇多,适合所有想学习游戏策划的同学们。经作者授权在知乎专栏“游戏设计梦工厂”和ndie同步首发。在美国,早期的独立游戏概念是相对于主机平台上高成本大团队的作品而言的。但是这些年,独立游戏和整个游戏市场经过大量的