1. 程式人生 > 其它 >【Example】C++ 單例模式演示 (被動模式、相容VS2022編譯)

【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
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian
TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back