趣谈设计模式 | 单例模式(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; //程序啟動時則創建對象從上面可以看到,因為一開始就直接加載了資源,所以餓漢模式并不存在線程安全的問題。在多線程高并發的環境下,性能需求較高時,就可以考慮使用餓漢模式來避免資源的競爭,提高響應速度。
但是他的缺點也正是這一點,因為無論后面用不用得到,都會提前加載資源,此時就會導致初始化的時間過長,導致效率不高。
懶漢模式
故名思意,懶漢有嚴重的拖延癥,只有事情到了,他才會去做,不會提前去做,與餓漢剛好相反。
他的核心就是延時加載,只有使用到某一個資源的時候,才會去加載他。這個特點就保證了他的高效,他不會花費大量的時間在初始化上,并且只會去加載即將使用到的資源。
但是也正因為懶漢模式在使用時才去創建,這就導致了可能會在多線程高并發的情況下爭搶資源,導致線程安全的問題。
具體思路都在注釋中
核心
懶漢和餓漢的區別
此時就不能夠使用餓漢,因為無法保證其初始化順序,而使用懶漢模式則可以手動控制
總結
以上是生活随笔為你收集整理的趣谈设计模式 | 单例模式(Singleton) :独一无二的对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程 | IO模型 :阻塞
- 下一篇: C++ 特殊类设计:只能在堆、栈上创建的