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