C++之單例模式~~

設計模式

什麼是設計模式
設計模式就是一套反覆被使用,多數人知曉,經過分類的,對於一些特定的場合總結的經驗。比如在古代,經常會發生戰爭,打仗也要有技巧,於是就出現了像孫子兵法,武穆遺書這種東西。。人們憑藉這着這些經驗,去解決相關的問題。在早期,一共有23種設計模式,例如簡單工廠模式,適配器模式,觀察者模式,單例模式等,而今天我與大家分享的就是單例模式。

單例模式

概念:單例模式指的就是一個類只能實例化一個對象。該模式保證了在系統中該類只有一個實例。比如在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象獲取這些配置信息,這種方式簡化了在複雜環境下的配置管理。下面我們看一下單例模式是如何實現的。

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

class Singleton{
	public:
		static Singleton* getInstance(){
			return &_instance;	
		} 
	private:
		Singleton(){};  //構造私有
		Singleton(Singleton const&); //拷貝構造私有
		Singleton& operator=(Singleton const&);  //賦值私有
		static Singleton _instance;
};
Singleton Singleton::_instance;  //程序入口前對單例對象初始化。
  1. 優點:實現比較簡單
  2. 缺點:可能會導致進程啓動慢,且如果有多個單例類對象實例啓動順序不確定。

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

//單例模式實現

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;


//懶漢模式實現

class Singleton {
public:
	static Singleton* GetInstance() {
		//外層判斷是防止多次加鎖導致CPU頻繁切換
		if (_instance == nullptr) {
			_mutex.lock();
			//內層判斷是保證只實例化一個對象
			if (_instance == nullptr) {
				_instance = new Singleton();
			}
			_mutex.unlock();
		}
		return _instance;
	}
	// 實現一個內嵌垃圾回收類
	class CGarbo {
	public:
		~CGarbo() {
			if (Singleton::_instance)
				delete Singleton::_instance;
		}
	};
	// 定義一個靜態成員變量,程序結束時,系統會自動調用它的析構函數從而釋放單例對象
	static CGarbo Garbo;
private:
	//構造 拷貝構造 賦值 私有化
	Singleton() {};
	Singleton(Singleton const&);
	Singleton& operator=(Singleton const&);
	static mutex _mutex;
	static Singleton* _instance;
};

Singleton* Singleton::_instance = nullptr;
mutex Singleton::_mutex;
Singleton::CGarbo Garbo;

void fun(int n) {
	cout << Singleton::GetInstance() << endl;
}

int main(void) {

	thread t1(fun, 10);
	thread t2(fun, 10);

	t1.join();
	t2.join();

	cout << Singleton::GetInstance() << endl;
	cout << Singleton::GetInstance() << endl;

	system("pause");
	return 0;
}
  1. 優點:初始化加載較快
  2. 缺點:程序運行的流暢度可能不夠,存在線程安全問題。

以上就是我關於單例模式的介紹以及代碼的實現,不足之處還望大家提醒我~~。

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