C++設計模式解析之單例模式解析

單例模式定義

該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

在C++中,我個人的理解是,不需要自己new類指針,這樣一方面也方便程序員自己管理內存,另一方面可以節省系統指針,減少佔用內存資源。

單例模式的實現要求

簡單的來說,就是一個類要有唯一的單例,而且這個單例類能夠被其他對象所調用,不能用,那就沒意義了嘛 。

單例模式的代碼實現

前面兩個定義和實現要求理解之後,讓我們來看看單例模式是如何在C++中被巧妙地利用。

首先看一下使用單例模式的類

頭文件單例類的定義如下:

//單例模式類
class Singleton
{
public:
	Singleton();
	~Singleton();
	void walk();

	static Singleton * getSingleton(); //返回單例指針
private:
	static Singleton * m_Instance;//單例全局指針

	//程序結束時釋放靜態成員
	class CGararge // 它的唯一工作就是在析構函數中刪除CSingleton的實例  
	{  
	public:  
		~CGararge()  
		{  
			//這邊清空單例指針 回收內存
			if (Singleton::m_Instance)  
				delete Singleton::m_Instance;  
		}  
	 };   
	static CGararge Garbo; // 定義一個靜態成員,在程序結束時,系統會調用它的析構函數  
};

其中定義了單例成員指針m_Instance或獲取單例指針的方式

還定義了類CGarbage 用於釋放單例指針

接下來是實現cpp文件

Singleton::Singleton()
{
}

Singleton* Singleton::m_Instance = nullptr;

Singleton::~Singleton()
{
	cout << "被析構了" << endl;
}

void Singleton::walk()
{
	cout << " I AM WALKING ALONE" << endl;
}

Singleton* Singleton::getSingleton()
{
	//如果沒被實例化 就先new一個
	if(m_Instance==nullptr)
	{
		m_Instance = new Singleton();
	}
	return m_Instance;
}

這裏面很容易看出來 getSingleton()函數用來new單例指針 判斷是否單例指針存在,這樣的好處 是可以保證整個類的全局指針 只佔用一個內存地址,無需每次都要new

接下來看一下測試代碼

	Singleton * cur_Instance = Singleton::getSingleton();
	cur_Instance->walk();
	cout << "舊的地址" << cur_Instance << endl;
	Singleton * cur_NextInstance = cur_Instance->getSingleton();
	cur_NextInstance->walk();
	cout << "新的地址"<< cur_NextInstance << endl;
	int mm ;
	cin >> mm;

運行程序 :

可以明顯的看出,只產生了一個實例指針,這樣很方便我們去管理內存,也不佔用內存資源

接下來看一下不用單例模式的常規類會有什麼不一樣

頭文件

class People
{
public:
	void walk();
};

定義了一個人的類 裏面一個walk方法

實現

void People::walk()
{
	cout << " I AM WALKING ALONE" << endl;
}

很簡單 和上面一樣

接下來看一下測試代碼

	People *p_people = new People();
	p_people->walk();
	People *p_nextPeople = new People();
	p_nextPeople->walk();
	cout << "舊地址" << p_people << endl; 
    cout << "新地址" <<  p_nextPeople << endl; 

	delete p_people;
	delete p_nextPeople;

測試代碼也很簡單

new了兩個指針 然後執行walk函數 最後看一下地址 然後釋放內存

看一下運行結果:

可以明顯看出 這個產生了兩個內存,如果在大型項目當中 需要在不同的文件當中引用類,很明顯,對於程序本身佔用內存 是個負擔,而且 很容易造成內存泄漏的現象,所以單例模式的優勢也顯而易見,可以儘可能佔用少的內存,並且及其易於管理內存,希望藉着兩個例子,能夠給大家帶來一點啓發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章