使用最廣同時也是面試問的最多的一個設計模式
代碼:
/** 單例:即程式只能擁有一個實體,比如資料庫連接池、日志系統等,這個類提供了一種訪問其唯一的物件的方式, * 單例分餓漢式和懶漢式,餓漢式無執行緒安全問題,懶漢式在多執行緒場景下存在執行緒安全問題,需要加鎖實作執行緒同步, */ #include <mutex> class Singleton { public: // static Singleton* getInstance() { 餓漢式 // return m_s; // } static Singleton* getInstance() { //執行緒安全的懶漢式(雙重判空?互斥鎖實作) if (nullptr == m_s) { m_mtx.lock(); if (nullptr == m_s) { m_s = new Singleton(); } m_mtx.unlock(); } return m_s; } private: Singleton(); Singleton(const Singleton&); Singleton(const Singleton&&); Singleton& operator=(const Singleton&); Singleton& operator=(const Singleton&&); static Singleton* m_s; static std::mutex m_mtx; }; Singleton* Singleton::m_s = nullptr; std::mutex Singleton::m_mtx;
還有一種方式:靜態區域變數實作的懶漢式,且執行緒安全的模式,
static SingleTon *get_instance() { static SingleTon s; return &s; }
某天面試被問到單例模式有什么缺點,沒了解過,只是說優點還是蠻多的,
查了一下,缺點:
1、由于單例模式中沒有抽象層,因此單例類的擴展有很大的困難,
2、單例類的職責過重,在一定程度上違背了“單一職責原則”,
3、濫用單例將帶來一些負面問題,如為了節省資源將資料庫連接池物件設計為單例類,可能會導致共享連接池物件的程式過多而出現連接池溢位;如果實體化的物件長時間不被利用,系統會認為是垃圾而被回收,這將導致物件狀態的丟失,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/501464.html
標籤:設計模式
