【Example】C++ 單例模式演示 (被動模式、相容VS2022編譯)
什麼是 Single Instance單例模式?
單例模式是計算機程式設計當中一種常用思路,即軟體系統運行當中,該類只允許擁有一個例項,且它必須在初始化的時候自己建立自己的例項。
那麼單例模式主要是什麼用途呢?
優化訪問效能,便於進行資料共享。
比如說:
1,軟體系統運行當中,業務上的配置檔案引數共享。
2,多執行緒之間資料的共享。
3,呼叫類似於資料庫操作這種需要頻繁訪問的物件時,減少 Object 的頻繁建立銷燬和函式呼叫的棧記憶體消耗。
4,資料需要臨時儲存時,給其他物件提供一個統一化的資料介面。
5,提升高度複用情況下的訪問效能。
那麼單例模式的具體實現方式是?
建立一個類,這個類會自己建立自己在記憶體當中的例項,例項可以被其他類訪問,同時不允許以任何方式再次建立這個類的例項。
其中有什麼原則?
1,必須保證在整個軟體系統執行的生命週期當中,例項僅有一個,不能被再次建立,也不能被拷貝、賦值。
2,必須保證記憶體的安全性問題。
3,必須保證執行緒的安全性問題。
4,必須保證例項僅能通過指定的介面獲得。
那麼具體有什麼細節?
1,可以通過將 構造、拷貝構造、賦值運算子過載 宣告為 Private 以保證例項不會被再次建立。
2,可以通過智慧指標進行包裝,以保證記憶體的安全性。
3,可以通過使用 Static 關鍵字保證例項指標常駐於記憶體全域性變數區。
4,可以使用 std::call_once 來保證類的例項只會建立一次,並且不會有執行緒安全問題。
單例模式分為主動模式和被動模式,區別是:
主動模式在類載入時就已經建立好了自己的例項。
被動模式在被第一次呼叫時才會建立自己的例項。
這裡演示的是被動模式:
================== 建立一個叫大腦工具箱的“工具類”==================
----------------- 標頭檔案-----------------
#pragma once #include <memory> using std::shared_ptr; using std::make_shared; #include <mutex> using std::call_once; using std::once_flag;// 建立一個叫大腦工具箱的單例類 class BrainToolBox { public: // 獲取單例的函式 static shared_ptr<BrainToolBox> GetInstance(); public: // 供呼叫的測試函式 void HelloByte(); private: // Private 鎖死構造和析構 BrainToolBox(); ~BrainToolBox(); // Private 鎖死拷貝構造 BrainToolBox(const BrainToolBox&) {}; // Private 鎖死賦值運算子 BrainToolBox& operator=(const BrainToolBox&) {}; private: // 單例的指標宣告 static shared_ptr<BrainToolBox> BrainInstance; // Onec Flag 宣告 static once_flag BrainOnceFlag; };
----------------- CPP檔案-----------------
#include <iostream> #include "BrainToolBox.h" // 單例的指標定義 shared_ptr<BrainToolBox> BrainToolBox::BrainInstance; // OnceFlag 定義 once_flag BrainToolBox::BrainOnceFlag; // 獲取單例 如果不存在則建立且只建立一次 shared_ptr<BrainToolBox> BrainToolBox::GetInstance() { call_once(BrainToolBox::BrainOnceFlag, [&] { struct make_shared_enabler : BrainToolBox{}; BrainToolBox::BrainInstance = make_shared<make_shared_enabler>(); }); return BrainToolBox::BrainInstance; } // 測試輸出一段字串以確定單例類被成功建立 void BrainToolBox::HelloByte() { std::cout << "Hello Byte!" << std::endl; return; } // 構造 BrainToolBox::BrainToolBox() { } // 析構 BrainToolBox::~BrainToolBox() { }
================== 測試一下==================
#include "BrainToolBox.h" int main() { shared_ptr<BrainToolBox> tool = BrainToolBox::GetInstance(); tool->HelloByte(); }
會列印 Hello Byte 字串。
TRANSLATE with x English TRANSLATE with EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back