先了解下單例設計模式:
單例模式的意思就是隻有一個執行個體。單例模式確定某一個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。這個類稱為單例類。
單例模式的要點有三個:
一是某個類隻能有一個執行個體;
二是它必須自行建立這個執行個體;
三是它必須自行向整個系統提供這個執行個體。
在下面的對象圖中,有一個"單例對象",而"客戶甲"、"客戶乙"和"客戶丙"是單例對象的三個客戶對象。 可以看到,所有的客戶對象共享一個單例對象。而且從單例對象到自身的連接配接線可以看出,單例對象持有對自己的引用。
cocos2d很好的利用了單例設計模式。
單例的好處是它可以在任何時間任何地點被任何類所調用。它接近于全局類的 作用,更像一個全局變量。如果你需要在任何地方都能用到某些資料或者方法, 單例是很好的選擇。音頻就是個很好的例子:因為任何一個類,不管是玩家, 敵人,菜單按鈕,或是過場動畫,都可能需要播放聲效或者改變背景音樂。因 此,使用單例來播放音頻是很好的選擇。同樣,如果存在全局的遊戲狀态,比 如說玩家軍隊的大小和每支部隊排的數目,你可以把這些資訊存到一個單例中, 把這些資訊從一個關卡傳到另一個關卡。
單例在程式生命周期中隻被執行個體化一次,為此常用利用類的一個靜态方法來生成和通路對象,cocos2d常通過share開頭的方法來通路單例對象,而不是用alloc/iniit或者靜态autorelease初始化,比如一下常用的方法
CCDirector類實作單例方法
單例也有不好的方法,本身很容易實作,在任何地方也可以被通路到,這就造成在不該用到的地方用上了,就會增加麻煩;
例如,你可能覺得你的遊戲隻有一個玩家對象,是以為什麼就不能把玩家這個類變成單例呢?一切看起來都沒有什麼問題 –直到你認識到不管什麼時候這個玩家進入下一個關卡,這個玩家不僅帶着上一關卡的得分,而且還有上一關卡的最後一幀動畫資訊,健康值,和所有已經撿到的物品,并且由于他在離開上一關卡的時候還在“狂暴”狀态下,在新關卡開始的時候,他還處于之前的狀态中。
為了解決這個問題,你可能會在類裡加入一個重置某些變量的方法。看起來問題解決了。但是當你在遊戲代碼中添加越來越多的功能以後,在轉換關卡時,你需要維護的變量也會越來越多。最糟糕的是,某天你的朋友建議你為iPad版本增加個雙人模式。但是你發現你的玩家類是個單例,在任何時候你隻能有一個玩家對象存在!這可麻煩了:要麼你要重寫很多代碼,或者隻能放棄很酷的雙人模式了。
本文轉自新風作浪 51CTO部落格,原文連結:http://blog.51cto.com/duxinfeng/1208776,如需轉載請自行聯系原作者