C++设计模式:单例模式->应用范例-创新互联

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

成都创新互联技术团队十年来致力于为客户提供网站制作、成都做网站、品牌网站设计成都全网营销推广、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了千余家网站,包括各类中小企业、企事单位、高校等机构单位。

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

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() 時,類會創建單例對象的實例,並在隨后的調用中返回相同的實例。

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

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:C++设计模式:单例模式->应用范例-创新互联
URL分享:http://ybzwz.com/article/gdcec.html