c++單例模式

1.設計模式
設計模式是一套被反覆使用,多數人知曉的,經過分類的,代碼設計經驗的總結。(套路)
設計模式的目的:爲了代碼可重用性,讓代碼更容易被他人理解,保證代碼的可靠性。設計模式使代碼編寫真正工程化,設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。

2.單例模式
一個類只能創建一個對象,即單例模式,該模式可以保證系統中該類只有一個實例,並提供一個訪問它的全局訪問點,該實例被所以程序模塊共享。
比如在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務器進程中的其他對象再通過這個單例對象獲取這些配置信息,這種方式簡化了在複雜環境下的配置管理。

單例模式有兩種實現模式:餓漢模式和懶漢模式

餓漢模式
就是說不管你將來用不用,程序啓動時就創建一個唯一的實例對象。

//餓漢模式
//優點:簡單
//缺點:可能會導致進程啓動慢,且如果有多個單例
//類對象實例啓動順序不確定
class Singleton{
public:
	static Singleton* GetInstance()
	{
		return &m_instance;
	}
private:
	//構造函數私有
	Singleton(){};

	//c++98 防拷貝
	Singleton(Singleton const&);
	Singleton& operator=(Singleton const&);

	//or
	//c++11
	/*Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&) = delete;*/

	static Singleton m_instance;
};

Singleton Singleton::m_instance;//在程序入口之前就完成單例對象的初始化

如果這個單例對象在多線程高併發環境下頻繁使用,性能要求較高,那麼顯然使用餓漢模式來避免資源競爭,提供相應速度更好。

懶漢模式
如果單例對象構造釋放耗時或者佔用很大資源,比如加載插件,初始化連接網絡,讀取文件等等,而有可能該對象程序運行時不會用到,那麼也要在程序一開始進行初始化,就會導致程序啓動時非常緩慢,所以這種情況下使用**懶漢模式(延遲加載)**更好。

//懶漢模式
//優點:第一次使用實例對象時,創建對象。進程啓動無負載,多個單例實例啓動順序可以自由控制
//缺點:複雜
#include<iostream>
#include<mutex>
#include<thread>
using namespace std;

class Singleton{
public:
	static Singleton* GetInstance()
	{
		//注意這裏一定要使用doule—check的方式加鎖,才能保證效率和線程的安全
		if (nullptr == m_pInstance)
		{
			m_mtx.lock();
			if (nullptr == m_pInstance)
			{
				m_pInstance = new Singleton();
			}
			m_mtx.unlock();
		}
		return m_pInstance;
	}
	//實現一個內嵌垃圾回收類
	class CGarbo{
	public:
		~CGarbo()
		{
			if (Singleton::m_pInstance)
			{
				delete Singleton::m_pInstance;
			}
		}
	};
	
	//定義一個靜態成員變量,程序結束時,系統會自動調用它的析構函數從而釋放單例對象
	static CGarbo Garbo;

private:
	//構造函數私有
	Singleton(){};

	//防拷貝
	Singleton(const Singleton&);
	Singleton& operator=(Singleton const&);

	static Singleton* m_pInstance;//單例對象指針
	static mutex m_mtx; //互斥鎖
};

Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章