C++ 單例模式解析

單例模式定義

該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。c++

在C++中,我我的的理解是,不須要本身new類指針,這樣一方面也方便程序員本身管理內存,另外一方面能夠節省系統指針,減小佔用內存資源。程序員

單例模式的實現要求

簡單的來講,就是一個類要有惟一的單例,並且這個單例類可以被其餘對象所調用,不能用,那就沒意義了嘛 。bash

單例模式的代碼實現

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

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

頭文件單例類的定義以下:ui

//單例模式類
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或獲取單例指針的方式spa

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

接下來是實現cpp文件code

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單例指針 判斷是否單例指針存在,這樣的好處 是能夠保證整個類的全局指針 只佔用一個內存地址,無需每次都要newcdn

接下來看一下測試代碼

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函數 最後看一下地址 而後釋放內存

看一下運行結果:

能夠明顯看出 這個產生了兩個內存,若是在大型項目當中 須要在不一樣的文件當中引用類,很明顯,對於程序自己佔用內存 是個負擔,並且 很容易形成內存泄漏的現象,因此單例模式的優點也顯而易見,能夠儘量佔用少的內存,而且及其易於管理內存,但願藉着兩個例子,可以給你們帶來一點啓發。

相關文章
相關標籤/搜索