該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。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函數 最後看一下地址 而後釋放內存
看一下運行結果:
能夠明顯看出 這個產生了兩個內存,若是在大型項目當中 須要在不一樣的文件當中引用類,很明顯,對於程序自己佔用內存 是個負擔,並且 很容易形成內存泄漏的現象,因此單例模式的優點也顯而易見,能夠儘量佔用少的內存,而且及其易於管理內存,但願藉着兩個例子,可以給你們帶來一點啓發。