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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

设计模式之单例模式(C++代码实现)

發布時間:2023/12/20 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之单例模式(C++代码实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、單例模式:

單例模式:用來創建獨一無二的,只能夠有一個實例的對象。 單例模式的結構是設計模式中最簡單的,但是想要完全實現一個線程安全的單例模式還是有很多陷阱的。

2、應用場景:

共享數據或者共享訪問點;
創建一個對象需要消耗的資源過多,如訪問IO和數據庫等資源;
需要定義大量的靜態常量和靜態方法(工具類)

單例模式的應用場景:有一些對象其實只需要一個,比如:windows Task Manager (任務管理器)、windows 回收站、線程池、緩存、對話框、處理偏好設置和注冊表的對象、日志對象、充當打印機、顯卡等設備的驅動程序對象。這些對象只能夠擁有一個實例,如果創建出了多個實例,就會導致一些程序的問題。程序的行為異常,資源使用的過量,或者導致不一致的結果。常用來管理共享的資源,比如數據庫的連接或者線程池。

3、優缺點:

優點:一個實例,減少內存開銷;減少系統開銷;避免對一個資源的多重占用;設置全局訪問點,優化和貢獻資源。

缺點:沒有借口,擴展性差;不利于測試;與單一職責原則有沖突,單例模式把“要單例”和業務邏輯融合在一個類中。

4、實現

1、經典實現(線程不安全)

class Singleton { public: static Singleton* getInstance(); protected: Singleton(){} private: static Singleton *p; }; Singleton* Singleton::p = NULL; Singleton* Singleton::getInstance() { if (NULL == p) p = new Singleton(); return p; } 1、當兩個線程運行至if(instance==NULL)時,可能產生線程安全問題。改進:在用到的時候在初始化,這樣程序效率比較高,但是有一個另外比較好的方法可以采用是提前初始化,將Instance設置為static之后直接初始化為Singleton對象,每次只需要執行返回操作即可。class Singleton { public:static Singleton* getInstance();protected:Singleton();private:static Singleton *instance; };//對單例直接進行初始化,而不再方法Instance中進行判斷。Singleton* Singleton::instance = new Singleton;Singleton* Singleton::getInstance(){return instance;} 這樣的話同樣會導致問題,就是如果單例本來資源比較多,但是不需要創建那么早,就會消耗資源~2、另外一種提升因為同步導致的性能變差的方法稱為“雙重檢驗加鎖”。方法如下:class Singleton { public:static Singleton* getInstance(); protected:Singleton(); private:static Singleton* instance; }Singleton *Singleton::instance = NULL; Singleton* Singleton::getInstance() {//check 之前進行臨界區加鎖操作//雙重檢驗加鎖if(_instance == NULL ) {lock();if( instance == NULL) {instance = new Singleton();}Unlock();}return _instance; }思路是只有在第一次創建的時候進行加鎖,當instance不為空的時候就不需要進行加鎖的操作,這樣就可以提升性能~

2、懶漢模式與餓漢模式

懶漢:故名思義,不到萬不得已就不會去實例化類,也就是說在第一次用到類實例的時候才會去實例化,所以上邊的經典方法被歸為懶漢實現;

餓漢:餓了肯定要饑不擇食。所以在單例類定義的時候就進行實例化。
特點與選擇

區別:由于要進行線程同步,所以在訪問量比較大,或者可能訪問的線程比較多時,采用餓漢實現,可以實現更好的性能。這是以空間換時間。在訪問量較小時,采用懶漢實現。這是以時間換空間。

1.加鎖實現線程安全的懶漢模式class Singleton { public: static pthread_mutex_t mutex; static Singleton* getInstance(); protected: Singleton() { pthread_mutex_init(&mutex); } private: static Singleton* p; }; pthread_mutex_t Singleton::mutex; Singleton* Singleton::p = NULL; Singleton* Singleton::getInstance() { if (NULL == p) { pthread_mutex_lock(&mutex); if (NULL == p) p = new Singleton(); pthread_mutex_unlock(&mutex); } return p; }2.內部靜態變量實現懶漢模式class Singleton { public: static pthread_mutex_t mutex; static Singleton* getInstance(); protected: Singleton() { pthread_mutex_init(&mutex); } }; pthread_mutex_t Singleton::mutex; Singleton* Singleton::getInstance() { pthread_mutex_lock(&mutex); static singleton obj; pthread_mutex_unlock(&mutex); return &obj; } 餓漢模式class Singleton { public: static Singleton* getInstance(); protected: Singleton(){} private: static Singleton* p; }; Singleton* Singleton::p = new Singleton; Singleton* Singleton::getInstance() { return p; }

總結

以上是生活随笔為你收集整理的设计模式之单例模式(C++代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

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