此篇將要學習的是管理着模式,他和上篇中的二段構建模式一樣,是在《Cocoa設計模式》一書中所提及的模式,在之所以出現在cocos2d-x中,主要是它能爲一組相關的對象提供一個統一的全局訪問點,同時可以提供一些簡潔的接口來獲取和操作這些對象。比如cocos2d-x中的CCTextureCache、CCSpriteFrameCache、CCAnimationCache等類,都採用了此設計模式。
【轉載自子龍山人】:http://zilongshanren.com/blog/2012/10/10/cocos2d-x-design-pattern-3-managers/
想必讀者一看這個題目又要納悶了,神馬又是“管理者模式”啊?
管理者(Manager)就是專門負責管理其它類的實例的類,比如Cocoa裏面的NSFontManager、NSInputManager、NSFileManager和NSLayoutManager類。此模式和“二段構建模式”一樣,也沒有出現在GoF的23個設計模式中,但是《Cocoa設計模式》一書中有提及,感興趣的讀者可以去查閱一下。
1.應用場景:
在cocos2d-x裏面有大量的應用,比如之前在介紹單例模式中提到的CCTextureCache, CCSpriteFrameCache, CCAnimationCache和CCShaderCache類。
這些管理者一般被設計成單例類。
爲什麼管理者類要設計成單例呢?因爲管理者一般會採用key-value的形式來管理其它類的實例,每當需要獲取一個管理者中的實例時,只需要提供一個惟一的鍵值字符串就可以得到一個與之對應的惟一實例。如果允許存在多個管理者實例的話,那麼每個管理者都會維護各自的key-value pairs。這樣顯然就不能通過鍵值字符串來獲得惟一對象實例了。
CCSpriteFrameCache類通過定製的plist文件來實例化一系列相關的CCSpriteFrame實例,然後只需要提供精靈幀的名字就可以得到相應的CCSpriteFrame實例了。從這個意義上來說,CCSpriteFrameCache類也可以說是一個工廠類,專門負責生產CCSpriteFrame實例。同時,如果精靈幀名字相同的話,那麼獲取的精靈幀實例也是相同的。
2.使用管理者模式的優缺點。
優點:爲一組相關的對象提供一個統一的全局訪問點,同時可以提供一些簡潔的接口來獲取和操作這些對象。同時,使用此模式來緩存遊戲中的常用資源,可以提高遊戲運行時性能。
缺點:由於管理者大多采用單例模式,所以,它繼承了單例模式所有的缺點,這裏就不再贅述了。
3.管理者模式的定義
管理者類(cache類)可以簡化一些可以重用的資源(比如字體、紋理、精靈幀等)的創建和管理工作。管理者模式其實是個混合模式,它綜合了單例模式、外觀模式和工廠模式。該模式在遊戲開發中比較常見,很多需要提升遊戲運行性能的場合都運用了此模式。
此模式的動機:提供一個統一的接口來管理一組相關對象的實例化和訪問。
它的一般實現如下:
class TestManager{ public: static TestManager *sharedTestManager(){ if (NULL == m_psManager) { m_psManager = new TestManager; instanceTable = CCDictionary::create(); instanceTable->retain(); } return m_psManager; } void purge(){ CC_SAFE_DELETE(m_psManager); CC_SAFE_RELEASE_NULL(instanceTable); } void registeInstance(const string& key,CCObject *obj){ instanceTable->setObject(ojb,key); } CCObject* getInstance(const string& key){ return instanceTable->objectForKey(key); } private: static TestManager* m_psManager; CCDictionary *instanceTable; //用來管理其它類的一組實例 }; TestManager* TestManager::m_psManager = NULL;
4.遊戲開發中如何運用此模式
在cocos2dx遊戲開發中,經常需要使用CCAnimate動作來播放動畫,這些動作的創建運行時開銷是比較大的,一般採用的方式都是在node的init方法中創建好,然後retain。之後需要使用的時候直接引用此動作即可,前提是你得聲明許多CCAnimate對象的弱引用。這裏,我們可以爲之創建一個CCAnimateCache類,專門用來管理這些動畫動作實例。這樣對於遊戲中經常變換狀態需要更換不同的動畫時,可以從此CCAniamteCache類中獲取相應動畫引用,非常方便,同時可以提高遊戲性能。相應的,也可以爲Action創建相應的類。
引申:但凡那些對象,在運行時創建的時間開銷特別大時,而又要經常重複使用時,都可以採取此模式來提高運行時性能。