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

單例模式(Singleton)

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

定義

單例是一種創(chuàng)建型設(shè)計模式,讓你能夠保證一個類只有一個實例,并提供一個訪問該實例的全局節(jié)點。

前言

1. 問題

單例模式同時解決了兩個問題,所以違反了單一職責(zé)原則:

  1. 保證一個類只有一個實例。
  2. 為該實例提供一個全局訪問節(jié)點。

為什么會有人想要控制一個類所擁有的實例數(shù)量?最常見的原因是控制某些共享資源(例如數(shù)據(jù)庫或文件)的訪問權(quán)限。它的運(yùn)作方式是這樣的:如果你創(chuàng)建了一個對象,同時過一會兒后你決定再創(chuàng)建一個新對象,此時你會獲得之前已創(chuàng)建的對象,而不是一個新對象。

注意,普通構(gòu)造函數(shù)無法實現(xiàn)上述行為,因為構(gòu)造函數(shù)的設(shè)計決定了它必須總是返回一個新對象。

單例模式(Singleton)

還記得你用過的那些存儲重要對象的全局變量嗎?它們在使用上十分方便,但同時也非常不安全,因為任何代碼都有可能覆蓋掉那些變量的內(nèi)容,從而引發(fā)程序崩潰。和全局變量一樣,單例模式也允許在程序的任何地方訪問特定對象。但是它可以保護(hù)該實例不被其他代碼覆蓋。

還有一點:你不會希望解決同一個問題的代碼分散在程序各處的。因此更好的方式是將其放在同一個類中,特別是當(dāng)其他代碼已經(jīng)依賴這個類時更應(yīng)該如此。

如今,單例模式已經(jīng)變得非常流行,以至于人們會將只解決上文描述中任意一個問題的東西稱為單例。

結(jié)構(gòu)

單例模式(Singleton)

?

單例(Singleton) 類聲明了一個名為getInstance 獲取實例的靜態(tài)方法來返回其所屬類的一個相同實例。

單例的構(gòu)造函數(shù)必須對客戶端(Client) 代碼隱藏。調(diào)用獲取實例方法必須是獲取單例對象的唯一方式。

適用場景

  • 如果程序中的某個類對于所有客戶端只有一個可用的實例,可以使用單例模式。

單例模式禁止通過除特殊構(gòu)建方法以外的任何方式來創(chuàng)建自身類的對象。該方法可以創(chuàng)建一個新對象,但如果該對象已經(jīng)被創(chuàng)建,則返回已有的對象。

  • 如果你需要更加嚴(yán)格地控制全局變量,可以使用單例模式。

單例模式與全局變量不同,它保證類只存在一個實例。除了單例類自己以外,無法通過任何方式替換緩存的實例。請注意, 你可以隨時調(diào)整限制并設(shè)定生成單例實例的數(shù)量,只需修改獲取實例方法, 即getInstance 中的代碼即可實現(xiàn)。

實現(xiàn)方式

  1. 在類中添加一個私有靜態(tài)成員變量用于保存單例實例。
  2. 聲明一個公有靜態(tài)構(gòu)建方法用于獲取單例實例
  3. 在靜態(tài)方法中實現(xiàn)"延遲初始化"。該方法會在首次被調(diào)用時創(chuàng)建一個新對象,并將其存儲在靜態(tài)成員變量中。此后該方法每次被調(diào)用時都返回該實例。
  4. 將類的構(gòu)造函數(shù)設(shè)為私有。類的靜態(tài)方法仍能調(diào)用構(gòu)造函數(shù),但是其他對象不能調(diào)用。
  5. 檢查客戶端代碼,將對單例的構(gòu)造函數(shù)的調(diào)用替換為對其靜態(tài)構(gòu)建方法的調(diào)用。

優(yōu)點

  • 你可以保證一個類只有一個實例。
  • 你獲得了一個指向該實例的全局訪問節(jié)點。
  • 僅在首次請求單例對象時對其進(jìn)行初始化。

缺點

  • 違反了單一職責(zé)原則。該模式同時解決了兩個問題。
  • 單例模式可能掩蓋不良設(shè)計,比如程序各組件之間相互了解過多等。
  • 該模式在多線程環(huán)境下需要進(jìn)行特殊處理,避免多個線程多次創(chuàng)建單例對象。
  • 單例的客戶端代碼單元測試可能會比較困難,因為許多測試框架以基于繼承的方式創(chuàng)建模擬對象。由于單例類的構(gòu)造函數(shù)是私有的,而且絕大部分語言無法重寫靜態(tài)方法,所以你需要想出仔細(xì)考慮模擬單例的方法。要么干脆不編寫測試代碼,或者不使用單例模式。

懶漢單例模式代碼

1. 線程不安全的懶漢單例模式

Singleton.h:

  • 構(gòu)造函數(shù)私有:即單例模式只能在內(nèi)部私有化
  • 實例對象static:保證全局只有一個
  • 外界通過GetInstance()獲取實例對象
#ifndef SINGLETON_H_
#define SINGLETON_H_

#include <iostream>
#include <string>

class Singleton {
 public:
    static Singleton* GetInstance() {
        if (instance_ == nullptr) {
            instance_ = new Singleton();
        }
        return instance_;
    }
 private:
    Singleton() {}
    static Singleton* instance_;
};

#endif  // SINGLETON_H_

Singleton.cpp:?

#include "Singleton.h"

// 靜態(tài)變量instance初始化不要放在頭文件中, 如果多個文件包含singleton.h會出現(xiàn)重復(fù)定義問題
Singleton* Singleton::instance_ = nullptr;

?main.cpp:

#include <iostream>
#include "Singleton.h"

int main() {
    Singleton *s1 = Singleton::GetInstance();
    Singleton *s2 = Singleton::GetInstance();

    std::cout << "s1地址: " << s1 << std::endl;
    std::cout << "s2地址: " << s2 << std::endl;
    return 0;
}

線程安全

上述代碼并不是線程安全的,當(dāng)多個線程同時調(diào)用Singleton::GetInstance(),可能會創(chuàng)建多個實例從而導(dǎo)致內(nèi)存泄漏(會new多次但我們只能管理唯一的一個instance_),我們這里簡單通過互斥鎖實現(xiàn)線程安全。

Singleton.hpp

#ifndef SINGLETON_H_
#define SINGLETON_H_

#include <iostream>
#include <string>
#include <mutex>

class Singleton {
 public:
    static Singleton* GetInstance() {
        if (instance_ == nullptr) {
            // 加鎖保證多個線程并發(fā)調(diào)用getInstance()時只會創(chuàng)建一個實例
            m_mutex_.lock();
            if (instance_ == nullptr) {
                instance_ = new Singleton();
            }
            m_mutex_.unlock();
        }
        return instance_;
    }
 private:
    Singleton() {}
    static Singleton* instance_;
    static std::mutex m_mutex_;
};

#endif  // SINGLETON_H_

?Singleton.cpp:

#include "Singleton.h"

// 靜態(tài)變量instance初始化不要放在頭文件中, 如果多個文件包含singleton.h會出現(xiàn)重復(fù)定義問題
Singleton* Singleton::instance_ = nullptr;
std::mutex Singleton::m_mutex_;

main.cpp:?

#include <iostream>
#include "Singleton.h"

int main() {
    Singleton *s1 = Singleton::GetInstance();
    Singleton *s2 = Singleton::GetInstance();

    std::cout << "s1地址: " << s1 << std::endl;
    std::cout << "s2地址: " << s2 << std::endl;
    return 0;
}

餓漢單例模式代碼

Singleton.h:

#ifndef SINGLETON_H_
#define SINGLETON_H_

class Singleton {
 public:
    static Singleton* GetInstance() {
        return instance_;
    }

 private:
    Singleton() {}
    static Singleton* instance_;
};

#endif  // SINGLETON_H_

Singleton.cpp:

#include "Singleton.h"

Singleton* Singleton::instance_ = new Singleton();

main.cpp:?文章來源地址http://www.zghlxwxcb.cn/news/detail-500591.html

#include <iostream>
#include "Singleton.h"

int main() {
    Singleton *s1 = Singleton::GetInstance();
    Singleton *s2 = Singleton::GetInstance();

    std::cout << "s1地址: " << s1 << std::endl;
    std::cout << "s2地址: " << s2 << std::endl;
    return 0;
}

到了這里,關(guān)于單例模式(Singleton)的文章就介紹完了。如果您還想了解更多內(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ìn)行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

  • 單例模式(Singleton)

    單例模式(Singleton)

    單例模式 保證一個類僅有一個實例 ,并 提供一個全局訪問點來訪問它 ,這個類稱為單例類。可見,在實現(xiàn)單例模式時,除了保證一個類只能創(chuàng)建一個實例外,還需提供一個全局訪問點。 為提供一個全局訪問點,可以使用全局變量,但全局變量無法禁止用戶實例化多個對象

    2024年02月14日
    瀏覽(19)
  • 設(shè)計模式四:單例模式(Singleton)

    單例模式,是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例的特殊類。 通過單例模式可以保證系統(tǒng)中,應(yīng)用該模式的類一個類只有一個實例。即一個類只有一個對象實例。 單例模式是設(shè)計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象

    2024年02月15日
    瀏覽(24)
  • 單例模式(Singleton Pattern)

    單例模式(Singleton Pattern)

    單例模式(Singleton Pattern)是結(jié)構(gòu)最簡單的設(shè)計模式,它的 核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類 。通過 單例模式可以確保系統(tǒng)中一個類只有一個實例 ,且該實例易于被外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。 如何確保一個類只有一個實例并且這個實

    2024年02月03日
    瀏覽(24)
  • 單例模式(Singleton Pattern)

    單例模式(Singleton Pattern)是一種創(chuàng)建型設(shè)計模式,用于確保一個類只有一個實例,并提供全局訪問點來獲取該實例。 單例模式的特點是: 只允許類創(chuàng)建一個實例。 提供一個全局訪問點來獲取該實例。 對外部代碼隱藏實例化過程,使得外部代碼無法直接創(chuàng)建實例。 以下是一

    2024年02月15日
    瀏覽(23)
  • java設(shè)計模式-單例模式(Singleton)

    單例模式(Singleton)就是一個類只能有一個實例,自行實例化,并向系統(tǒng)提供這一實例,這個類就是單例類。單例模式的特點: 一個類只能有一個實例; 單例類自己實例化; 單例類給其它對象提供這個單一實例。 資源管理類經(jīng)常被設(shè)計為單例模式,例如管理屬性文件的類。

    2024年02月15日
    瀏覽(19)
  • C++ 中的單例模式singleton

    在面向?qū)ο缶幊讨?,設(shè)計模式是解決常見問題的最佳實踐。單例模式是其中之一,它確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。在本文中,我們將詳細(xì)介紹 C++ 中的單例模式。 單例模式是一種設(shè)計模式,它限制一個類只能創(chuàng)建一個對象。這個模式通常用

    2024年02月21日
    瀏覽(23)
  • 大話設(shè)計模式——9.單例模式(Singleton Pattern)

    大話設(shè)計模式——9.單例模式(Singleton Pattern)

    簡介 確保一個類只有一個實例,并提供全局訪問點來獲取該實例,是最簡單的設(shè)計模式。 UML圖: 單例模式共有兩種創(chuàng)建方式: 餓漢式(線程安全) 提前創(chuàng)建實例,好處在于該實例全局唯一,不存在線程沖突;壞處在于未使用時也會占用內(nèi)存資源。 懶漢式(原生寫法存在線

    2024年04月12日
    瀏覽(52)
  • 《游戲編程模式》學(xué)習(xí)筆記(六)單例模式 Singleton Pattern

    保證一個類只有一個實例,并且提供了訪問該實例的全局訪問點。 定義這種東西一般都是不說人話的,要想要理解這句話的意思,我們得把它揉開了才能搞明白。 我們先看前半句 “保證一個類只有一個實例”,單例一般使用類來實現(xiàn),也就是說,這個單例類,其有且只能有

    2024年02月12日
    瀏覽(24)
  • 在序列化、反序列化下如何保持單例(Singleton)模式

    1、序列化、反序列化 在 Java 中,當(dāng)一個對象被序列化后再被反序列化,通常情況下會創(chuàng)建一個新的對象實例。這是因為序列化將對象的狀態(tài)保存到字節(jié)流中,而反序列化則是將字節(jié)流重新轉(zhuǎn)化為對象。在這個過程中,通常會使用類的構(gòu)造函數(shù)創(chuàng)建一個新的對象,并將保存的

    2024年02月13日
    瀏覽(18)
  • C++11手撕線程池 call_once 單例模式 Singleton / condition_variable 與其使用場景

    C++11手撕線程池 call_once 單例模式 Singleton / condition_variable 與其使用場景

    一、call_once 單例模式 Singleton? 大家可以先看這篇文章:https://zh.cppreference.com/w/cpp/thread/call_once call_once 應(yīng)用在單例模式,以及 關(guān)于單例模式我的往期文章推薦: C++ 設(shè)計模式----“對象性能“模式_愛編程的大丙 設(shè)計模式-CSDN博客 https://heheda.blog.csdn.net/article/details/131466271 二、

    2024年01月23日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包