日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

趣谈设计模式 | 单例模式(Singleton) :独一无二的对象

發布時間:2024/4/11 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 趣谈设计模式 | 单例模式(Singleton) :独一无二的对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 單例模式
  • 餓漢模式
  • 懶漢模式
  • 懶漢和餓漢的區別


單例模式

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

單例模式有兩種常見的實現方法,分別是懶漢模式餓漢模式


餓漢模式

作為一個餓漢,自然不會等到饑餓的時候才去做飯,而是馬上就去提前做,等到飯點到了,就立刻開始吃。餓漢模式的核心就是預加載即不管你之后會不會用,程序啟動時就會去加載所有的資源。

class EagerSingleton { public://提供給外界一個唯一的對象static EagerSingleton* GetInstance(){return &_inst;}EagerSingleton& operator=(const EagerSingleton&) = delete; //c++11寫法,為了防止拷貝,直接把拷貝構造和賦值運算符刪除EagerSingleton(const EagerSingleton&) = delete; private://構造函數私有化,此時只能創建靜態對象。EagerSingleton(){};/*c++98寫法,將成員函數私有化,使得外界無法調用EagerSingleton& operator=(const EagerSingleton&);EagerSingleton(const EagerSingleton&);*/static EagerSingleton _inst;//使用靜態的成員,因為靜態成員屬于整個類域,是唯一的一份。在程序開始階段創建之后,其他人獲取時只需要返回指向這個對象的指針即可 };EagerSingleton EagerSingleton::_inst; //程序啟動時則創建對象

從上面可以看到,因為一開始就直接加載了資源,所以餓漢模式并不存在線程安全的問題。在多線程高并發的環境下,性能需求較高時,就可以考慮使用餓漢模式來避免資源的競爭,提高響應速度。
但是他的缺點也正是這一點,因為無論后面用不用得到,都會提前加載資源,此時就會導致初始化的時間過長,導致效率不高。


懶漢模式

故名思意,懶漢有嚴重的拖延癥,只有事情到了,他才會去做,不會提前去做,與餓漢剛好相反。
他的核心就是延時加載只有使用到某一個資源的時候,才會去加載他。這個特點就保證了他的高效,他不會花費大量的時間在初始化上,并且只會去加載即將使用到的資源。

但是也正因為懶漢模式在使用時才去創建,這就導致了可能會在多線程高并發的情況下爭搶資源,導致線程安全的問題。

具體思路都在注釋中
核心

  • double-cheak(提高效率)
  • 加鎖防止爭搶資源(保證線程安全)
  • 內嵌GC(程序結束即自動銷毀資源)
  • class LazySingleton { public://獲取對象static LazySingleton* GetInstance(){//雙重檢查,第一重檢驗是否創建對象,防止不必要的加鎖if (_inst == nullptr){//第二重檢驗保證線程安全//_mtx.lock();std::unique_lock<std::mutex> lock(_mtx);//RAII保證因異常拋出導致的安全問題if (_inst == nullptr){_inst = new LazySingleton;}//_mtx.unlock();}return _inst;}//刪除對象static void DelInstance(){std::unique_lock<std::mutex> lock(_mtx);if(_inst){delete _inst;_inst = nullptr;}}//運用RAII的思想內嵌一個GC類,程序結束時自動調用析構函數來釋放單例對象class GC{public:~GC(){LazySingleton::DelInstance();}};static GC gc;LazySingleton& operator=(const LazySingleton&) = delete; //c++11寫法,為了防止拷貝,直接把拷貝構造和賦值運算符刪除LazySingleton(const LazySingleton&) = delete; private:LazySingleton(){};/*c++98寫法,將成員函數私有化,使得外界無法調用LazySingleton& operator=(const LazySingleton&);LazySingleton(const LazySingleton&);*/static LazySingleton* _inst;static std::mutex _mtx; };LazySingleton::GC gc; LazySingleton* LazySingleton::_inst = nullptr; std::mutex LazySingleton::_mtx;

    懶漢和餓漢的區別

  • 懶漢模式需要考慮線程安全和資源釋放的問題,實現來說相對復雜一點。餓漢模式不存在這類問題,實現相對簡單。
  • 懶漢是一種懶加載模式,只在需要時才會創建對象,不會影響程序的啟動。而餓漢模式剛好相反,程序啟動階段就創建對象,導致程序啟動速度慢,影響用戶體驗。
  • 如果有多個單例類,假設之間存在著依賴關系,例如B依賴A,要求A單例先創建初始化,B單例再創建初始化
    此時就不能夠使用餓漢,因為無法保證其初始化順序,而使用懶漢模式則可以手動控制
  • 總結

    以上是生活随笔為你收集整理的趣谈设计模式 | 单例模式(Singleton) :独一无二的对象的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。