日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

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

文章目錄

  • 單例模式
  • 餓漢模式
  • 懶漢模式
  • 懶漢和餓漢的區(qū)別


單例模式

一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,即單例模式,該模式可以保證系統(tǒng)中該類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全
局訪問點(diǎn),該實(shí)例被所有程序模塊共享。
比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件
中,這些配置數(shù)據(jù)由一個(gè)單例對(duì)象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對(duì)象再通過這個(gè)單例對(duì)象獲取這些配置
信息,這種方式簡化了在復(fù)雜環(huán)境下的配置管理。

單例模式有兩種常見的實(shí)現(xiàn)方法,分別是懶漢模式餓漢模式


餓漢模式

作為一個(gè)餓漢,自然不會(huì)等到饑餓的時(shí)候才去做飯,而是馬上就去提前做,等到飯點(diǎn)到了,就立刻開始吃。餓漢模式的核心就是預(yù)加載即不管你之后會(huì)不會(huì)用,程序啟動(dòng)時(shí)就會(huì)去加載所有的資源。

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

從上面可以看到,因?yàn)橐婚_始就直接加載了資源,所以餓漢模式并不存在線程安全的問題。在多線程高并發(fā)的環(huán)境下,性能需求較高時(shí),就可以考慮使用餓漢模式來避免資源的競爭,提高響應(yīng)速度。
但是他的缺點(diǎn)也正是這一點(diǎn),因?yàn)闊o論后面用不用得到,都會(huì)提前加載資源,此時(shí)就會(huì)導(dǎo)致初始化的時(shí)間過長,導(dǎo)致效率不高。


懶漢模式

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

但是也正因?yàn)閼袧h模式在使用時(shí)才去創(chuàng)建,這就導(dǎo)致了可能會(huì)在多線程高并發(fā)的情況下爭搶資源,導(dǎo)致線程安全的問題。

具體思路都在注釋中
核心

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

    懶漢和餓漢的區(qū)別

  • 懶漢模式需要考慮線程安全和資源釋放的問題,實(shí)現(xiàn)來說相對(duì)復(fù)雜一點(diǎn)。餓漢模式不存在這類問題,實(shí)現(xiàn)相對(duì)簡單。
  • 懶漢是一種懶加載模式,只在需要時(shí)才會(huì)創(chuàng)建對(duì)象,不會(huì)影響程序的啟動(dòng)。而餓漢模式剛好相反,程序啟動(dòng)階段就創(chuàng)建對(duì)象,導(dǎo)致程序啟動(dòng)速度慢,影響用戶體驗(yàn)。
  • 如果有多個(gè)單例類,假設(shè)之間存在著依賴關(guān)系,例如B依賴A,要求A單例先創(chuàng)建初始化,B單例再創(chuàng)建初始化
    此時(shí)就不能夠使用餓漢,因?yàn)闊o法保證其初始化順序,而使用懶漢模式則可以手動(dòng)控制
  • 總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。