C++ 设计模式:单例模式 ->应用范例

單例模式是一種設計模式,它保證一個類別只有一個實例,並提供一個全局訪問點來訪問該實例。

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

class Singleton
{
private:
    static Singleton* instance;

private:
    Singleton() {}

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

Singleton* Singleton::instance = nullptr;

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

當需要保證一個類別只有一個實例並提供一個全局訪問點時。
當類別負責建立和管理其他資源,並希望只使用單個資源時。
當類別需要控制它的實例數量時。
單例模式有一個缺點,就是它不利於測試,因為無法對單例類別進行測試。


范例1:這裡是如何實現單例模式的一個示例:

在 C++ 中實現單例模式通常有以下幾個步驟:

  1. 定義私有的構造函數,防止在類外部通過 new 關鍵字創建對象。
  2. 定義私有的靜態成員變量,用來保存單例對象的指針。
  3. 定義公有的靜態成員函數,用來返回單例對象的指針。在首次調用時創建單例對象,之後的調用都返回相同的指針。
  4. 在析構函數中釋放單例對象的資源。

示例代碼如下:

class Singleton
{
private:
    Singleton() {}  // 私有構造函數
    static Singleton* instance;  // 私有靜態成員變量

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

    ~Singleton()  // 析構函數
    {
        delete instance;
        instance = nullptr;
    }
};

Singleton* Singleton::instance = nullptr;  // 初始化靜態成員變量

然而,這種實現方式存在一些問題:

在多執行緒環境下,可能會同時創建多個單例對象。

在執行時期加載的情況下,可能會創建多個單例對象的副本。

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

如何使用 可以参考这篇文章 

        C++ 设计模式:单例模式 >C++11 的 std::once_flag 和 std::call_once


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

例子中,Singleton 类的構造函數被設置為私有的,這意味着只能在類的內部創建實例。取而代之的是,類提供了一個公共的靜態函數 getInstance(),用於返回單例對象的實例。在第一次調用 getInstance() 時,類會創建單例對象的實例,並在隨后的調用中返回相同的實例。

通常,單例類的實例也會被定義為靜態的,這意味着它在整個程序的生命週期中都有效。

#include <iostream>

class Singleton
{
private:
    static Singleton* instance;
    Singleton() {}  // 私有的構造函數

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值