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

【設(shè)計模式】C++單例模式詳解

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

單例模式

?個類僅有?個實例,并提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。

那么,我們必須保證:該類不能被復(fù)制;也不能被公開的創(chuàng)造。

對于 C++ 來說,它的構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)都不能被公開調(diào)用。

單例模式又分為 懶漢模式餓漢模式 ,它們之間各有好處:

  1. 懶漢模式的實例在第一次被引用時才進行初始化,支持延遲加載,資源利用效率更高;但是當(dāng)資源訪問頻繁時,資源同步問題(加鎖、解鎖)會限制并發(fā)性能,也就是不支持高并發(fā)。

  2. 餓漢模式提前初始化實例,啟動時間較長;但是可以避免資源同步(加鎖、解鎖)帶來的性能消耗,后續(xù)的響應(yīng)時間更好。

餓漢模式

在加載類時,對象實例就被創(chuàng)建并初始化,在程序結(jié)束時自動銷毀,因此,它是線程安全的。

//.h文件 
class Singleton { 
public:   
    static Singleton* GetInstance(){    
        return _Instance; 
    }
  
private:   
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton&) = delete;   
    Singleton& operator = (const Singleton&) = delete; 

private:   
    static Singleton* _Instance; 
}; 

// .CPP文件 
Singleton* Singleton::_Instance = nullptr;  // 類外初始化,必須寫

懶漢模式

在 C++11 標(biāo)準(zhǔn)中,靜態(tài)局部變量 的初始化是線程安全的,因此,可以用以下方式來編寫“懶漢”模式:

class Singleton {
public:
    static Singleton& GetInstance() {
        static Singleton instance;  
        return instance;
    }
private:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator = (const Singleton&) = delete;
};

更加傳統(tǒng)的寫法如下,使用 雙重檢查鎖定 來確保線程安全,通過靜態(tài)成員函數(shù) Destructor 來解決內(nèi)存泄漏:

//代碼實例(線程安全) 
emplate<typename T> 
class Singleton { 
public: 
    static T* getInstance() {       
        if (_instance == nullptr) {   
            lock_guard<mutex> lock(_mutex);   
            if (_instance == nullptr) {     // 雙重檢查鎖定, 確保線程安全
                _instance = new T();
                atexit(Destructor);     // 在程序退出的時候釋放資源
            }
        }   
        return _instance; 
    } 
private:    
    // 防止外界構(gòu)造/拷貝/刪除對象
    Singleton() = default;     
    ~Singleton() = default;     
    Singleton(const Singleton&) = delete;
    Singleton& operator = (const Singleton&) = delete;
  
    static void Destructor() {
        if (_instance != nullptr) {
            delete _instance;
            _instance = nullptr;
        }
    }
    
    // 靜態(tài)指針
    static T* _instance; 
    // 互斥鎖
    static mutex _mutex;
}; 

// 初始化靜態(tài)指針
template<typename T> 
T* Singleton<T>::_instance = nullptr;

// 初始化互斥鎖
template<typename T>
mutex Singleton<T>::_mutex;

但是,這種寫法可能出現(xiàn)以下問題:

由于 new 操作分為三步:分配內(nèi)存、返回指針、調(diào)用構(gòu)造函數(shù);如果一個線程在分配內(nèi)存后返回了指針,但還沒有構(gòu)造對象,另一個線程就嘗試訪問該對象的情況,就可能會出現(xiàn)未定義行為或錯誤。

因此,還是推薦使用“靜態(tài)局部變量”的寫法。

單例的應(yīng)用

需要強調(diào)的是,單例只是一種組織全局變量和靜態(tài)函數(shù)的方式 。

當(dāng)我們想要擁有應(yīng)用于某種全局?jǐn)?shù)據(jù)集的功能,并且我們想要重復(fù)使用時,單例是非常有用的。比如以下場景:

  • 配置管理;

  • 日志記錄;

  • 消息隊列;

  • 線程池、連接池、內(nèi)存池、對象池。

但是,單例模式是存在弊端的:

  1. 單例模式會隱藏類之間的依賴關(guān)系。

由于單例類不需要顯示地創(chuàng)建,也不需要依賴參數(shù)傳遞,在函數(shù)中直接調(diào)用就好,所以在閱讀代碼時,需要仔細(xì)閱讀才能清楚哪些類依賴了單例類。

  1. 單例模式的拓展性較差。

單例類只能創(chuàng)建一個實例,如果哪天需要在代碼中創(chuàng)建多個實例,則需要對代碼進行較大的改動。

以數(shù)據(jù)庫連接池為例,假設(shè)一開始我們將其設(shè)計為一個單例類,而后我們發(fā)現(xiàn),有些 SQL 語句的執(zhí)行效率低下,長時間占用連接資源,因此我們希望再創(chuàng)建一個連接池實例,讓它專門處理運行速度較慢的 SQL 語句,而此時,單例模式就對代碼的拓展性產(chǎn)生了影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-744442.html

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

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 創(chuàng)建型模式 - 單例設(shè)計模式

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

    2024年02月16日
    瀏覽(24)
  • 【設(shè)計模式 創(chuàng)建型】單例模式

    類的單例設(shè)計模式,就是 采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例 ,并且該類只提供一個取得其對象實例的方法(靜態(tài)方法) 指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種模式 。 特點: 某個類只能有一個實例( 即構(gòu)造器私有

    2024年01月20日
    瀏覽(22)
  • 創(chuàng)建型設(shè)計模式06-單例模式

    創(chuàng)建型設(shè)計模式06-單例模式

    ?????作者:貓十二懿 ?????賬號:CSDN 、掘金 、個人博客 、Github ??公眾號:貓十二懿 單例模式是一種創(chuàng)建型設(shè)計模式,它的目的是 確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例 。在單例模式中,類自身負(fù)責(zé)創(chuàng)建自己的唯一實例,并確保在系統(tǒng)中只

    2024年02月08日
    瀏覽(24)
  • 學(xué)習(xí)筆記-設(shè)計模式-創(chuàng)建型模式-單例模式

    一個類只有一個實例,并提供一個全局訪問此實例的點,哪怕多線程同時訪問。 單例模式主要解決了 一個全局使用的類被頻繁的創(chuàng)建和消費 的問題。 單例模式的案例場景 數(shù)據(jù)庫的連接池不會反復(fù)創(chuàng)建 spring中一個單例模式bean的生成和使用 在我們平常的代碼中需要設(shè)置全局

    2024年02月08日
    瀏覽(18)
  • 【地鐵上的設(shè)計模式】--創(chuàng)建型模式:單例模式(五)--枚舉單例

    什么是枚舉單例 枚舉單例是指使用枚舉類型來實現(xiàn)單例模式,它是單例模式中最簡單、最安全的一種實現(xiàn)方式。在枚舉類型中定義的枚舉值只會被實例化一次,即保證了全局唯一的實例,而且實現(xiàn)簡單、線程安全、防止反射攻擊、支持序列化等。 如何實現(xiàn)枚舉單例 實現(xiàn)枚舉

    2023年04月25日
    瀏覽(20)
  • 設(shè)計模式-創(chuàng)建型模式(單例、工廠、建造、原型)

    設(shè)計模式:軟件設(shè)計中普遍存在(反復(fù)出現(xiàn))的各種問題,所提出的解決方案。 面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)。 面向?qū)ο笤O(shè)計的SOLID原則: (1)開放封閉原則:一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉。即軟件實體應(yīng)盡量在不修改原有代碼的情

    2024年02月08日
    瀏覽(28)
  • c#設(shè)計模式-創(chuàng)建型模式 之 單例模式

    目錄 前言: 優(yōu)點: 缺點: 餓漢式(靜態(tài)變量方式) 懶漢式(線程不安全) 懶漢式(雙重檢查鎖定) 推薦方式Lazy 總結(jié): 這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供 了一種訪問其唯一的對象的方式,可以直接訪問,

    2024年02月13日
    瀏覽(31)
  • GO設(shè)計模式——4、單例模式(創(chuàng)建型)

    目錄 單例模式(Singleton Pattern)?? 優(yōu)缺點 使用場景 餓漢式和懶漢式單例模式 ????????單例模式(Singleton Pattern)是一個類 只允許創(chuàng)建一個 對象(或者實例),那這個類就是一個單例類,這種設(shè)計模式就叫作單例設(shè)計模式,簡稱單例模式。單例模式的要點有三個:一是

    2024年02月05日
    瀏覽(24)
  • 【Java 設(shè)計模式】創(chuàng)建型之單例模式

    【Java 設(shè)計模式】創(chuàng)建型之單例模式

    在軟件開發(fā)中,單例模式是一種常見的設(shè)計模式, 它確保一個類只有一個實例,并提供一個全局訪問點 。單例模式在需要控制某些資源,如數(shù)據(jù)庫連接池、線程池等共享資源的情況下非常有用。在本文中,我們將介紹 Java 設(shè)計模式中的單例模式,了解其實現(xiàn)方式、使用場景

    2024年01月18日
    瀏覽(26)
  • 深入理解設(shè)計模式-創(chuàng)建型之單例模式

    如果有些數(shù)據(jù)在系統(tǒng)中應(yīng)該且只能保存一份,那就應(yīng)該設(shè)計為單例類。 如:配置類:在系統(tǒng)中,我們只有一個配置文件,當(dāng)配置文件被加載到內(nèi)存之后,應(yīng)該被映射為一個唯一的【配置實例】,此時就可以使用單例,當(dāng)然也可以不用。 全局計數(shù)器:我們使用一個全局的計數(shù)

    2024年02月12日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包