Cocos2d-x設計模式--二段構建模式

設計模式在程序設計中會常常用到,也許你歷來沒有留意過設計模式,其實你卻一直在使用設計模式!cocos2dx中有很多的設計模式,因此從本篇博客開始探討一下cocos2dx中的設計模式,看看引擎都使用了哪些設計模式,咱們從此寫代碼要怎樣使用某種設計模式。

你們最熟悉的是單例設計模式了吧,在cocos2dx中單例真是很多啊,咱們的大導演不就是單例嗎,單例設計模式我以前寫過一篇博客,這裏就很少說了。第二個設計模式是觀察者模式,什麼是觀察者模式,如何實現觀察者模式。就是被觀察者含有一個數組,裏邊存放了全部觀察者的引用,在被觀察者的狀態發生改變的時候,經過調用觀察者的函數來通知觀察者,實現了信息的傳遞。以前也有一篇博客寫了cocos2dx中用來實現觀察者模式的事件監聽器NotificationCenter,你們能夠看看。本篇博客探討一下二段構建模式,首先第一個問題是什麼是二段構建模式。html

你們都知道在c++中咱們通常在構造函數中爲對象分配內存空間而後初始化成員變量,好比咱們調用了new某個東西,那麼在堆上會先爲對象分配內存空間,而後調用構造函數,在構造函數中完成一些初始化的工做。而二段構建模式就是將內存空間的分配和初始化分開來完成,而後調用一個靜態方法來返回這個對象。就拿cocos2dx中的Sprite類來講吧,當咱們調用Sprite::create()的時候內部先使用new來分配內存空間,而後調用init方法來初始化一些變量的設置。因此cocos2dx中的二段構建模式就是將new分配內存空間和init初始化內容分開來處理,而不是c++傳統的作法在構造函數中初始化變量。c++

1 Sprite* Sprite::create()
2     {
3         //分配內存
4         Sprite *sprite = new Sprite();
5         //init初始化
6         if (sprite && sprite->init())
7         {
8             //內存管理的工做
9             sprite->autorelease();
10             return sprite;
11         }
12         CC_SAFE_DELETE(sprite);
13         return nullptr;
14     }

上邊就是使用二段構建模式的過程,Sprite首先調用new來分配內存空間,而後調用init函數來完成初始化的工做,順帶還作了內存管理的工做,最後返回初始化好的對象。因此看了Sprite的create方法的實現,咱們也知道了應該怎麼使用這個二段構建模式了吧。程序員

第二個問題是爲何要這麼用,對於c++程序員來講初始化工做不都是在構造函數中完成的嗎,cocos中爲什麼要這麼作呢?這裏引述一下王哲的話:「其實咱們設計二段構造時首先考慮其優點而非兼容cocos2d-iphone. 初始化時會遇到圖片資源不存在等異常,而C++構造函數無返回值,只能用try-catch來處理異常,啓用try-catch會使編譯後二進制文件大很多,故須要init返回bool值。Symbian, Bada SDK,objc的alloc + init也都是二階段構造」。如今你們明白了吧,兼容cocos2d-iphone是一個緣由,另外一個重要的緣由是構造函數沒有返回值啊,若是加載資源圖片的時候不存在怎麼辦,因此初始化的工做寫在init函數中,這個函數返回的bool值用來判斷是否初始化成功。使用這種方法還能夠強化設計,想一想本身寫代碼的時候是否是由於沒有初始化某個成員變量致使了bug,這樣作就是提醒你記得要在init中初始化成員變量。經過create靜態函數返回的這個對象也實現了cocos2dx中的內存管理,就不用咱們本身麻煩了。還有一個緣由是在c++的構造函數中是不能調用虛函數的,爲了調用虛函數來完成一些功能就要寫在init函數中。設計模式

以上就是二段構建模式的說明了,在咱們寫cocos程序的時候其實不知不覺就已經在使用這個構建模式了,想一下咱們一個類繼承了Layer,而後使用了宏CREATE_FUNC(),這不就是create靜態方法嗎,在init函數中完成了初始化,整個過程就是在用這種設計模式!數組

相關文章
相關標籤/搜索