国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++設計模式創(chuàng)建型之單例模式

這篇具有很好參考價值的文章主要介紹了C++設計模式創(chuàng)建型之單例模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、概述

? ? ? ? 單例模式也稱單態(tài)模式,是一種創(chuàng)建型模式,用于創(chuàng)建只能產(chǎn)生一個對象實例的類。例如,項目中只存在一個聲音管理系統(tǒng)、一個配置系統(tǒng)、一個文件管理系統(tǒng)、一個日志系統(tǒng)等,甚至如果吧整個Windows操作系統(tǒng)看成一個項目,那么其中只存在一個任務管理器窗口等。引入單例模式的實現(xiàn)意圖:保證一個類僅有一個實例存在,同時提供能對該實例訪問的全局方法。

二、單例模式分類

1、懶漢模式

1)代碼示例

class CSingletonImpl
{
public:
?? ?static CSingletonImpl* GetInstance()
?? ?{
?? ??? ?if (m_pInstance == nullptr)
?? ??? ?{
?? ??? ??? ?m_pInstance = new CSingletonImpl;
?? ??? ?}

?? ??? ?return m_pInstance;
?? ?}
private:
?? ?CSingletonImpl(){};
?? ?~CSingletonImpl(){};
?? ?CSingletonImpl(const CSingletonImpl& the);
?? ?CSingletonImpl& operator=(const CSingletonImpl& other);
private:
?? ?static CSingletonImpl* m_pInstance;
};

CSingletonImpl*CSingletonImpl::m_pInstance = nullptr;

2)說明

單例模式為了防止多對象問題,將構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù),賦值運算符函數(shù)設置為私有,同時設置公有唯一接口方法來創(chuàng)建對象,同時定義類靜態(tài)指針。這是通用方法,那么會有什么問題呢?如果在單一線程中使用則沒什么問題,但是在多線程中使用則可能導致問題,如果多個線程可能會因為操作系統(tǒng)時間片調(diào)度問題切換造成多對象產(chǎn)生,那么解決這個問題的方案就是對GetInstance()成員函數(shù)枷鎖。

示例代碼:

加入私有成員變量:static std::mutex m_mutex;

static CSingletonImpl* GetInstance()
{

?m_mutex.lock();
?if (m_pInstance == nullptr)
?{
? m_pInstance = new CSingletonImpl;
?}
?m_mutex.unlock();

?return m_pInstance;
}

加入以上代碼沒有問題了嗎?呵呵,還不行,雖然對接口函數(shù)加鎖,從代碼邏輯上沒有問題,實現(xiàn)了線程安全,但是從執(zhí)行效率上來說,是有大問題的。當程序運行中GetInstance()可能會被多個線程頻繁調(diào)用,每次調(diào)用都會經(jīng)歷加鎖解鎖的過程,這樣的話會嚴重影響程序執(zhí)行效率,而且加鎖機制僅僅對第一次創(chuàng)建對象有意義,對象一旦創(chuàng)建則變成只讀對象,在多線程中,對只讀對象的訪問加鎖不僅代價大,而且無意義。那么如何解決這個問題呢?那就是雙重鎖定機制,基于這種機制函數(shù)實現(xiàn)代碼:

?? ?static CSingletonImpl* GetInstance()
?? ?{
?? ??? ?if (m_pInstance == nullptr)
?? ??? ?{
?? ??? ??? ?std::lock_guard<std::mutex> siguard(si_mutex);
?? ??? ??? ?if (m_pInstance == nullptr)
?? ??? ??? ?{
?? ??? ??? ??? ?m_pInstance = new CSingletonImpl;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return m_pInstance;
?? ?}

上述雙重鎖定機制看起來比較完美,但實際上存在潛在的問題,內(nèi)存訪問重新排序?qū)е码p重鎖定失效的問題,比較推薦的方法時C++11新標準的一些特性,示例代碼如下:

#include <mutex>
#include <atomic>

//通過原子變量解決雙重鎖定底層問題(load,store)
class CSingletonImpl
{
public:
?? ?static CSingletonImpl* GetInstance()
?? ?{
?? ??? ?CSingletonImpl* task = m_taskQ.load(std::memory_order_relaxed);?
?? ??? ?std::atomic_thread_fence(std::memory_order_acquire);
?? ??? ?if (task == nullptr)
?? ??? ?{
?? ??? ??? ?std::lock_guard<std::m_mutex> lock(m_mutex);
?? ??? ??? ?task = m_taskQ.load(std::memory_order_relaxed);?
?? ??? ??? ?if (task == nullptr)
?? ??? ??? ?{
?? ??? ??? ??? ?task = new CSingletonImpl;
?? ??? ??? ??? ?std::atomic_thread_fence(std::memory_order_release);
?? ??? ??? ??? ?m_taskQ.store(task, std::memory_order_relaxed);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return task;
?? ?}
private:
?? ?CSingletonImpl(){};
?? ?~CSingletonImpl(){};
?? ?CSingletonImpl(const CSingletonImpl& the);
?? ?CSingletonImpl& operator=(const CSingletonImpl& other);
private:
?? ?static std::mutex m_mutex;
?? ?static std::atomic<CSingletonImpl*> m_taskQ;
};

std::mutex CSingletonImpl::m_mutex;
std::atomic<CSingletonImpl*> CSingletonImpl::m_taskQ;

2、餓漢模式

1)示例代碼

class CSingletonImpl
{
public:
?? ?static CSingletonImpl* GetInstance()
?? ?{
?? ??? ?return m_pInstance;
?? ?}
private:
?? ?CSingletonImpl(){};
?? ?~CSingletonImpl(){};
?? ?CSingletonImpl(const CSingletonImpl& the);
?? ?CSingletonImpl& operator=(const CSingletonImpl& other);
private:
?? ?static CSingletonImpl* m_pInstance;
};

CSingletonImpl*CSingletonImpl::m_pInstance = new CSingletonImpl();

2)說明

此類模式可稱為餓漢式--------程序一執(zhí)行不管是否調(diào)用了GetInstance()成員函數(shù),這個單例類對象就已經(jīng)被創(chuàng)建了。在餓漢式單例類代碼的實現(xiàn)必須要注意,如果一個項目中有多個.cpp源文件,而且這些源文件中包含對全局變量的初始化代碼,例如某個.cpp中可能存在如下代碼:

int g_test =?CSingletonImpl::GetInstance()->m_i; //m_i是int類型變量

那么這樣的代碼是不安全的,因為多個源文件中全局變量的初始化順序是不確定的,很可能造成GetInstance()函數(shù)返回是nullptr,此時去訪問m_i成員變量肯定會導致程序執(zhí)行異常。所以,對餓漢式單例類對象的使用,應該在程序入口函數(shù)開始執(zhí)行后,例如main函數(shù)后。

注意:函數(shù)第一次執(zhí)行時被初始化的靜態(tài)變量與通過編譯器常量進行初始化的基本類型靜態(tài)變量這兩種情況,不要再單例類的析構(gòu)函數(shù)中引用其他單例類對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-634096.html

到了這里,關于C++設計模式創(chuàng)建型之單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C++設計模式創(chuàng)建型之工廠模式整理

    一、工廠模式分類 ????????工廠模式屬于創(chuàng)建型模式,一般可以細分為簡單工廠模式、工廠模式和抽象工廠模式。每種都有不同的特色和應用場景。 二、工廠模式詳情 1、簡單工廠模式 1)概述 ? ? ? ? 簡單工廠模式相對來說,在四人組寫的《設計模式------可復用面向?qū)?/p>

    2024年02月14日
    瀏覽(22)
  • 設計模式之單例設計模式

    就是一個類只允許創(chuàng)建一個對象,那么我們稱該類為單例類,這種設計模式我們稱為單例模式。 資源共享:有些類擁有共享的資源,例如數(shù)據(jù)庫連接池、線程池、緩存等。使用單例模式確保只有一個實例,避免資源浪費和競爭條件。 線程安全:單例模式可以用來保證多線程

    2024年02月07日
    瀏覽(29)
  • 【前端設計模式】之單例模式

    在前端開發(fā)中,單例模式是一種常見的設計模式,用于確保一個類只有一個實例,并提供全局訪問點。在實現(xiàn)單例模式時,有一些最佳實踐和高級技巧可以幫助我們編寫更優(yōu)雅和可維護的代碼。 使用閉包是實現(xiàn)單例模式的一種常見方法。通過將類的實例保存在閉包中,并提供

    2024年02月09日
    瀏覽(25)
  • Unity設計模式之單例模式

    單例模式(Singleton)是設計模式中很常見的一種設計模式,目的是為了讓一個類在程序運行期間有且僅有一個實例,且方便全局訪問。 1、私有的構(gòu)造函數(shù)。 2、含有一個該類的靜態(tài)私有對象。 3、靜態(tài)的公有函數(shù)或?qū)傩?,方便用戶?chuàng)建或者獲取它本身的靜態(tài)私有對象。 當項目

    2023年04月09日
    瀏覽(23)
  • C#設計模式之單例模式

    單例模式(Singleton)保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 單例模式的結(jié)構(gòu)圖如下所示: 對一些類來說,只有一個實例是很重要的。如何才能保證一個類只有一個實例并且這個實例易于被訪問呢? 基于程序員之間的約定或是利用全局變量嗎? 雖然這樣

    2024年02月03日
    瀏覽(22)
  • Java設計模式之單例模式

    Java設計模式之單例模式

    定義:保證一個類僅有一個實例,并提供一個全局訪問點 類型:創(chuàng)建型 想確保任何情況下都絕對只有一個實例 例如:線程池,數(shù)據(jù)庫連接池一般都為單例模式 單例模式優(yōu)點 在內(nèi)存中只有一個實例,減少內(nèi)存開銷 可以避免對資源的多重占用 設置全局訪問點,嚴格控制訪問

    2024年02月02日
    瀏覽(56)
  • 設計模式之單例模式(懶漢, 餓漢)

    設計模式之單例模式(懶漢, 餓漢)

    單例模式是一種常用的軟件設計模式, 該模式的主要目的是確保某一個類在內(nèi)存中只能有一個實例對象, 通過單例模式的方法創(chuàng)建的類在當前進程中只有一個實例對象. 常見的單例模式有兩種: 餓漢式, 這里的 “餓” 意義表述不夠清晰, 用 “急” 來表述意義更加容易聯(lián)想一些

    2024年02月22日
    瀏覽(20)
  • C#--設計模式之單例模式

    C#--設計模式之單例模式

    單例模式大概是所有設計模式中最簡單的一種,如果在面試時被問及熟悉哪些設計模式,你可能第一個答的就是單例模式。 單例模式的實現(xiàn)分為兩種: 餓漢式:在靜態(tài)構(gòu)造函數(shù)執(zhí)行時就立即實例化。 懶漢式:在程序執(zhí)行過程中第一次需要時再實例化。 兩者有各自適用的場景

    2024年02月14日
    瀏覽(12)
  • 淺談設計模式之單例模式

    淺談設計模式之單例模式

    單例模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。單例模式指的是 單一的一個類 ,該類負責創(chuàng)建自己的對象,并且保證該 對象唯一 。該類提供了一種訪問其唯一對象的方法,外部需要調(diào)用該類的對象可以通過方法獲取,不需要實例化類的對象。 關鍵點: 單例

    2024年02月16日
    瀏覽(20)
  • 萬字解析設計模式之單例模式

    萬字解析設計模式之單例模式

    單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 這種模式涉及到一個 單一 的類,該類負責創(chuàng)建自己的對象,同時確保 只有單個對象被創(chuàng)建 。這個類提供了一種訪問其唯一的對象的方式,

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包