遊戲中的設計模式 單例模式

2022-08-17 16:27:14 字數 2170 閱讀 4050

遊戲中用到單例模式的例子很多,幾乎適用於系統資源管理類中,如聊天,道具,日誌等等。

單例模式(singleton),保證了全域性有且只有乙個例項物件,保證自動地初始化該物件,使得程式在任何時候任何地方都可以訪問、獲取該物件。

通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是讓類自身儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問該例項的方法。

基本上類圖都像這樣:

這裡把建構函式定義為private或protected,可以防止外界利用new建立此類例項。而且getinstance是乙個靜態的函式,主要負責建立自己的唯一例項。而且getinstance是乙個靜態的函式,主要負責建立自己的唯一例項。

//

獲取某個類的單例

#define getclassinstance( classname ) static_cast( cmysingleton::getinstance() )

//單例模板

template class

cmysingleton

return

m_pinstance;

}/**

* 消除全域性唯一例項物件。

*/static

void

destroy()

} private

:

static t*m_pinstance;

};

但有時候,在多執行緒的程式中,多個執行緒同時訪問singleton,呼叫getinstance()方法,會有可能造成建立多個例項。這時候就要給程式加鎖。

//

獲取某個類的單例

#define getclassinstance( classname ) static_cast( cmysingleton::getinstance() )

//單例模板

template class

cmysingleton

public

: ~cmysingleton()

public

: /**

* 獲取全域性唯一例項物件。如果還沒有建立,建立她。

*/static t*getinstance()

pthread_mutex_unlock(&m_mutex);

}return

m_pinstance;

}/**

* 消除全域性唯一例項物件。

*/static

void

destroy()

} private

:

static t*m_pinstance;

pthread_mutex_t m_mutex;

};

這裡有個疑惑,為什麼在lock後,還需要做一次instance例項是否存在的判斷?

當instance為null並且同時有兩個純種呼叫getinstance()方法時,它們將都可以通過第一重判斷。然後由於lock機制,這兩個執行緒則只有乙個進入,另乙個在外排隊等候,必須要其中的乙個進入並出來後,另乙個才能進入。而此時如果沒有了第二重的判斷,則第乙個執行緒建立了例項,而第二個執行緒還是可以繼續再建立新的例項,這就沒有達到單例的目的了。

總結單例模式有以下的特點: 

1 單例類只可有乙個例項。 

2 單例類必須自己建立自己這惟一的例項。 

3 單例類必須給所有其他物件提供這一例項。

4 在大併發程式裡,可能有多個執行緒同時訪問單例,所以一定要記得加鎖。

多執行緒時:

單例模式主要有2中形式,一種是餓漢式,一種是懶漢式。

餓漢式:程式一載入單例模式就已經建立了,也就很飢餓嘛。因為是靜態屬性進行單例初始化,所以優點是執行緒是安全的,缺點是無論使用者是否使用單例物件都會建立單例物件。

//

靜態屬性類外初始化

singleton_hungry* singleton_hungry::singleton = new singleton_hungry;

懶漢式:當使用者使用單例物件時,才去建立單例物件,所以很懶惰嘛。優點是使用者不使用就不會建立物件,缺點是 當遇到多執行緒是,是執行緒不安全的,但是我們可以使用加強版的也就是執行緒安全的懶漢式。(上面用到的是這個)。

參考:遊戲中的設計模式:單例模式

c++單例模式:單例模式遇到多執行緒

遊戲中的設計模式 工廠模式

現在的網遊更新很快,要延長網路遊戲生命週期的方法是,更新,不斷地更新,不斷的將新內容呈現於玩家面前。這要求遊戲程式的設計要有彈性,的重用至關重要。今天就說說遊戲中的工廠模式。說到工廠模式,有簡單工廠模式,工廠方法模式,抽象工廠模式。一 簡單工廠模式 ps 物件導向的程式設計,並不是類越多越好,類的劃...

遊戲設計筆記 單例模式

package 單例模式 public static function getinstance player return player 引用網上的說話 單例模式的要點有三個 一是某各類只能有乙個例項 二是它必須自行建立這個事例 三是它必須自行向整個系統提供這個例項。單例模式有以下的特點 1 單例類...

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...