天天看點

C++設計模式之單例(Singleton)模式

單例模式,是一個相對簡單且常用的一個設計模式,也許我們一直都在使用,隻是不知道這就是單例模式。我們在大型工程中,為了讓程式更具拓展性,且友善策劃進行數值微調等,都會将一些内容寫到一個配置檔案中(常見的是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() 。

單例模式核心的部分就是私有化構造函數,且隻提供一個靜态的生成對象的接口。

繼續閱讀