單例模式,是一個相對簡單且常用的一個設計模式,也許我們一直都在使用,隻是不知道這就是單例模式。我們在大型工程中,為了讓程式更具拓展性,且友善策劃進行數值微調等,都會将一些内容寫到一個配置檔案中(常見的是XML配置檔案)。程式負責解析配置檔案,并根據配置内容作出相應的操作。但是,配置檔案一般調配好後很少改動,且解析配置檔案需要耗費一定的資源(時間、存儲空間等),一般不會寫一個解析類,每次需要用的時候都生成一個對象。我們的做法是,編寫一個單例類,在程式初始化時對配置檔案進行解析,需要用的時候都調用這個單例,最多再開一個Reload接口,讓在需要時重新加載配置檔案。
要編寫單例類,我們就會想到要對構造函數進行處理,并且對生成對象進行控制。的确,單例模式正是這樣操作的:
#ifndef __CWeaponTable_H_
#define __CWeaponTable_H_
class CWeaponTable
{
public:
static CWeaponTable& GetInstance()
{
static CWeaponTable __inst;
return __inst;
}
bool Reload()
{
//解析配置檔案
return true;
}
std::string GetWeaponName(u32 WeaponID) {}
private:
CWeaponTable()
{
Reload();
}
private:
};
#define TheCWeaponTable CWeaponTable::GetInstance()
#endif
我們知道,當手動定義了類的構造函數時,類就不會合成預設的構造函數,那麼我們就把它定義成private(或protected)權限,這樣就不能在類外生成對象,而隻能由類的函數生成。我們進一步對類中生成對象的接口進行控制,讓其為靜态函數,類的靜态函數和資料是屬于類而非對象,所有的對象都共享一份函數。
如上,我們在初始化時隻需TheCWeaponTable;或CWeaponTable::GetInstance();就可以構造出一個靜态對象,該對象通過定義的構造函數對配置檔案進行解析。如果我們在後面需要使用該配置,直接像 TheCWeaponTable.GetWeaponName(10011) 一樣用就可以。如果在需要的時候,我們同樣可以從新解析配置檔案 TheCWeaponTable.Reload() 。
單例模式核心的部分就是私有化構造函數,且隻提供一個靜态的生成對象的接口。