1. 程式人生 > >cocos2dx中的Director類中的getInstance()方法解析,即單例模式

cocos2dx中的Director類中的getInstance()方法解析,即單例模式

接觸cocos2dx有段時間了,對於Director::getInstance()這樣的程式碼也有段時間的困惑了,為什麼要這樣寫,這是什麼意思呀?原來查了查資料才知道這是單例設計模式的應用。

  • 單例設計模式

    • 為什麼用單例設計模式:用window系統裡面的工作管理員做例子解釋下,當我們按下Ctrl+Alt+Del時候會彈出“資源管理器”的視窗,假如我們再一次按下這三個鍵,你回發現不會出現新的”資源管理器“視窗,還是原來的這有一個視窗。為什麼不像開啟“我的電腦”一點,開啟幾次就出現幾次視窗呢?原因很簡單,如果出現了兩個“資源管理器”視窗,那麼哪個視窗顯示的是當前實時的資源執行情況呢?假如兩個視窗不一樣的話,使用者要用哪個才是反映真實的電腦資源情況呢?類同到cocos2dx引擎裡面,就是隻讓有一個”導演類”來進行操作,避免出現歧義。
    • 什麼事單例設計模式:具體的定義大家可以百度百科一下,這個不是我今天要寫的重點。
  • getInstance()方法解析
    首先看一段c++的程式碼
//.h檔案
#include <iostream>
//數學與邏輯學中singleton定義為“有且僅有一個元素的集合”。
class Singleton{
public:
    static Singleton* getInstance();

private:
    Singleton();
    ~Singleton();

    static Singleton* instance;
};
//.cpp檔案
#include "Singleton.h"
using namespace std; Singleton::Singleton(){ cout<<"Create Singleton"<<endl; } Singleton::~Singleton(){ cout<<"Destroy Singleton"<<endl; } Singleton* Singleton::instance = new Singleton(); Singleton* Singleton::getInstance(){ return instance; }

在標頭檔案中把建構函式和解構函式宣告在private下面,是為了不能使用new在類的外部生成一個物件。但是,在public中的用靜態成員函式getInstance(),生成該類的唯一物件。該成員函式是回調了該類的靜態Singleton*型別的成員變數instance,而變數instance則在類的實現部分賦值了一個Singleton物件,從而實現了單例物件的建立。

補充:原則上靜態成員函式只能直接訪問靜態成員變數,不能直接呼叫非靜態函式(不是絕對不可以),且靜態成員函式沒有this指標,不屬於派生的某一個物件,屬於該類即所有派生的物件。靜態成員變數相當於類的全域性變數,也不屬於某一個物件,每一個派生出來的物件共同擁有該變數。最後一點,非靜態變數只有在派生出物件是才分配記憶體,而靜態的物件是在程序啟動初始化的時候就完成了。