今天主要是學習了單例模式的三種實作,包括懶漢式、雙重檢查鎖懶漢式和餓漢式,
首先,我們應該要理解單例模式的概念,單例模式簡單的來說就是一個類只允許有一個物件,為此,我們可以知道必須要控制類的構造行為,故將建構式私有化、同時將該類的物件
定義為該類的靜態資料成員(因為建構式被私有化了),
- 首先是懶漢式,懶漢式理解起來最為直接,直接上代碼
#include "commonHeader.h" class lanhan { public: static lanhan * getInstance() { if (nullptr == instance) { instance = new lanhan(); } return instance; } private: lanhan() { } static lanhan * instance; }; lanhan * lanhan::instance = nullptr;
通過每次去判斷instance是否為空,從而保證instace只會被初始化一次,但是這種保證只在單執行緒的情況下成立,當多個執行緒都對instace==nullptr進行判斷時,instance無疑
還是會被執行多次,
2. 考慮到懶漢式在多執行緒下存在的問題,于是也有人提出了使用互斥鎖來保證這一點,代碼如下:
#include <mutex> #include "commonHeader.h" class lanhanPlus { public: static lanhanPlus * getInstance() { if (nullptr == instance) { helpLock.lock(); if (nullptr == instance) { instance = new lanhanPlus(); } helpLock.unlock(); } return instance; } private: lanhanPlus() { } static lanhanPlus * instance; static mutex helpLock; }; lanhanPlus * lanhanPlus::instance = nullptr; mutex lanhanPlus::helpLock;
通過借助互斥鎖的幫助,懶漢式在多執行緒環境下也能保證類達到單例的要求,同時這里通過兩層判空的設定,不會對程式的性能造成太多的影響,
3. 餓漢式,餓漢式非常巧妙的借助了靜態區域變數的特性,存盤在靜態區,作用域區域,只會在第一次定義時被初始化,非常完美,代碼如下:
#include "commonHeader.h" class ehan { public: static ehan * getInstance() { static ehan * instance; return instance; } private: ehan() { } };
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285514.html
標籤:C++
