回顾游戏中的设计模式:策略模式vs抽象工厂
最近有時(shí)間看看設(shè)計(jì)模式方面的書,好多東西時(shí)間久了不看就變得生疏起來(lái), 在這里會(huì)抽出時(shí)間把自己在工作中使用過的設(shè)計(jì)模式做下總結(jié)。
剛才在看到別人說,簡(jiǎn)單工廠模式是“通過提供單獨(dú)的一個(gè)類,來(lái)實(shí)現(xiàn)創(chuàng)建實(shí)例對(duì)象的過程”,可以使用反射來(lái)替換掉程序中的switch/if..else,嗯,這是沒問題的,但實(shí)際應(yīng)用中,在移動(dòng)端還要盡量少的去頻繁使用反射Reflection,嚴(yán)重依賴字符串的功能都會(huì)存在效率的問題。
今天在看到策略模式(Strategy Pattern)的時(shí)候,突然間意識(shí)到自己在16年的一個(gè)項(xiàng)目中,有一處應(yīng)用不夠合理。
當(dāng)時(shí)在存儲(chǔ)游戲數(shù)據(jù)部分,我是通過直接將對(duì)象圖轉(zhuǎn)化成字節(jié)流的形式,即序列化。
那么序列化有多種方式,你可以序列化成XML,也可以是二進(jìn)制,或者是SOAP(類似于XML,不建議使用,只是為了多提供一個(gè)策略演示)。
那么這時(shí)候,采用哪種設(shè)計(jì)模式?
當(dāng)時(shí)使用的是抽象工廠,但實(shí)際上,他更符合策略模式。即我們將多個(gè)“策略”抽象成接口的形式來(lái)解耦合。
比如說我要回大連,我可以坐火車,飛機(jī),客車,或是自駕。我最終的目的是相同的,只是到達(dá)目的的方式不同。
然而在代碼上,策略模式和抽象工廠區(qū)別不是很大,后來(lái)我搜索了一下關(guān)于兩個(gè)設(shè)計(jì)模式之間的區(qū)別,找到了一個(gè)非常好的解釋 。
2009年的一個(gè)帖子。解釋如下:
抽象工廠屬于創(chuàng)建型的,而策略模式屬于行為型。
抽象工廠往往是抽取的同一基類(Class)的不同子類。
策略模式往往抽取的是同一接口的不同實(shí)現(xiàn)。
那么顯然,我在序列化的時(shí)候,我序列化為哪種格式,只是行為不同(純行為上),結(jié)果相同,而且也符合同一接口的不同實(shí)現(xiàn)。
那么說到這里了,就把之間的代碼給修改一下,修改為策略模式。
定義序列化接口:
ISerializable.cs
?
聲明了兩個(gè)方法,序列化和反序列化。
下面實(shí)現(xiàn)具體的序列化類,買二手游戲平臺(tái)分別是Binary,XML,SOAP
BinarySerialized.cs
XMLSerialized .cs
?
SOAPSerialized.cs(SOAP要引入dll[System.Runtime.Serialization.Formatters.Soap.dll])
?
最后我們定義一個(gè)序列化的上下文,面向接口編程:
SerializableContext.cs
?
演示代碼:
?
在這里定義了一個(gè)DataManager類,DataManager包含了
?
兩個(gè)字段,并進(jìn)行初始化,然后對(duì)DataManager類,進(jìn)行序列化和反序列化測(cè)試。
?
總結(jié)
以上是生活随笔為你收集整理的回顾游戏中的设计模式:策略模式vs抽象工厂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《炉石传说》架构设计赏析(4):Asse
- 下一篇: 《炉石传说》架构设计赏析(3):Game