C++設(shè)計(jì)模式:單例模式->應(yīng)用范例-創(chuàng)新互聯(lián)

單例模式是一種設(shè)計(jì)模式,它保證一個類別只有一個實(shí)例,並提供一個全局訪問點(diǎn)來訪問該實(shí)例。

成都創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)十年來致力于為客戶提供網(wǎng)站制作、成都做網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)成都全網(wǎng)營銷推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了千余家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

單例模式通常會使用一個靜態(tài)成員來保存單例的唯一實(shí)例,並提供一個靜態(tài)方法來獲取該實(shí)例。例如:

class Singleton
{
private:
    static Singleton* instance;

private:
    Singleton() {}

public:
    static Singleton* getInstance()
    {
        if (instance == nullptr)
            instance = new Singleton();
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;

單例模式可以在以下情況中使用:

當(dāng)需要保證一個類別只有一個實(shí)例並提供一個全局訪問點(diǎn)時。
當(dāng)類別負(fù)責(zé)建立和管理其他資源,並希望只使用單個資源時。
當(dāng)類別需要控制它的實(shí)例數(shù)量時。
單例模式有一個缺點(diǎn),就是它不利於測試,因?yàn)闊o法對單例類別進(jìn)行測試。


范例1:這裡是如何實(shí)現(xiàn)單例模式的一個示例:

在 C++ 中實(shí)現(xiàn)單例模式通常有以下幾個步驟:

  1. 定義私有的構(gòu)造函數(shù),防止在類外部通過 new 關(guān)鍵字創(chuàng)建對象。
  2. 定義私有的靜態(tài)成員變量,用來保存單例對象的指針。
  3. 定義公有的靜態(tài)成員函數(shù),用來返回單例對象的指針。在首次調(diào)用時創(chuàng)建單例對象,之後的調(diào)用都返回相同的指針。
  4. 在析構(gòu)函數(shù)中釋放單例對象的資源。

示例代碼如下:

class Singleton
{
private:
    Singleton() {}  // 私有構(gòu)造函數(shù)
    static Singleton* instance;  // 私有靜態(tài)成員變量

public:
    static Singleton* getInstance()  // 公有靜態(tài)成員函數(shù)
    {
        if (!instance)
            instance = new Singleton();
        return instance;
    }

    ~Singleton()  // 析構(gòu)函數(shù)
    {
        delete instance;
        instance = nullptr;
    }
};

Singleton* Singleton::instance = nullptr;  // 初始化靜態(tài)成員變量

然而,這種實(shí)現(xiàn)方式存在一些問題:

在多執(zhí)行緒環(huán)境下,可能會同時創(chuàng)建多個單例對象。

在執(zhí)行時期加載的情況下,可能會創(chuàng)建多個單例對象的副本。

為了解決這些問題,可以使用 C++11 的 std::once_flag 和 std::call_once

如何使用 可以參考這篇文章?

C++ 設(shè)計(jì)模式:單例模式 >C++11 的 std::once_flag 和 std::call_once


范例2:下面是一個 C++ 單例類的示例:

例子中,Singleton 類的構(gòu)造函數(shù)被設(shè)置為私有的,這意味著只能在類的內(nèi)部創(chuàng)建實(shí)例。取而代之的是,類提供了一個公共的靜態(tài)函數(shù) getInstance(),用於返回單例對象的實(shí)例。在第一次調(diào)用 getInstance() 時,類會創(chuàng)建單例對象的實(shí)例,並在隨后的調(diào)用中返回相同的實(shí)例。

通常,單例類的實(shí)例也會被定義為靜態(tài)的,這意味著它在整個程序的生命週期中都有效。

#includeclass Singleton
{
private:
    static Singleton* instance;
    Singleton() {}  // 私有的構(gòu)造函數(shù)

public:
    static Singleton* getInstance()
    {
        if (!instance)
            instance = new Singleton();
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;

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

    std::cout<< std::hex<< s1<< std::endl;
    std::cout<< std::hex<< s2<< std::endl;

    return 0;
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章名稱:C++設(shè)計(jì)模式:單例模式->應(yīng)用范例-創(chuàng)新互聯(lián)
路徑分享:http://bm7419.com/article42/gdcec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站排名、靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站收錄、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)