趣谈设计模式 | 单例模式(Singleton) :独一无二的对象
文章目錄
- 單例模式
- 餓漢模式
- 懶漢模式
- 懶漢和餓漢的區(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)致線程安全的問題。
具體思路都在注釋中
核心
懶漢和餓漢的區(qū)別
此時(shí)就不能夠使用餓漢,因?yàn)闊o法保證其初始化順序,而使用懶漢模式則可以手動(dòng)控制
總結(jié)
以上是生活随笔為你收集整理的趣谈设计模式 | 单例模式(Singleton) :独一无二的对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程 | IO模型 :阻塞
- 下一篇: 趣谈设计模式 | 观察者模式(Obser