設計模式
什麼是設計模式
設計模式就是一套反覆被使用,多數人知曉,經過分類的,對於一些特定的場合總結的經驗。比如在古代,經常會發生戰爭,打仗也要有技巧,於是就出現了像孫子兵法,武穆遺書這種東西。。人們憑藉這着這些經驗,去解決相關的問題。在早期,一共有23種設計模式,例如簡單工廠模式,適配器模式,觀察者模式,單例模式等,而今天我與大家分享的就是單例模式。
單例模式
概念:單例模式指的就是一個類只能實例化一個對象。該模式保證了在系統中該類只有一個實例。比如在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象獲取這些配置信息,這種方式簡化了在複雜環境下的配置管理。下面我們看一下單例模式是如何實現的。
餓漢模式實現:就是不管你將來用不用,程序啓動時就創建一個唯一的對象。
class Singleton{
public:
static Singleton* getInstance(){
return &_instance;
}
private:
Singleton(){}; //構造私有
Singleton(Singleton const&); //拷貝構造私有
Singleton& operator=(Singleton const&); //賦值私有
static Singleton _instance;
};
Singleton Singleton::_instance; //程序入口前對單例對象初始化。
- 優點:實現比較簡單
- 缺點:可能會導致進程啓動慢,且如果有多個單例類對象實例啓動順序不確定。
懶漢模式實現:如果單例對象構造十分耗時或者佔用很多資源,比如加載插件啊, 初始化網絡連接啊,讀取文件啊等等,而有可能該對象程序運行時不會用到,那麼也要在程序一開始就進行初始化,就會導致程序啓動時非常的緩慢。 所以這種情況使用懶漢模式(延遲加載)更好。
//單例模式實現
#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;
}
- 優點:初始化加載較快
- 缺點:程序運行的流暢度可能不夠,存在線程安全問題。
以上就是我關於單例模式的介紹以及代碼的實現,不足之處還望大家提醒我~~。