溫馨提示×

c++單例模式的實現(xiàn)方式有哪些

c++
小億
77
2023-10-31 12:08:04
欄目: 編程語言

在C++中,可以通過以下幾種方式來實現(xiàn)單例模式:

  1. 餓漢式單例模式(Eager Initialization): 在類定義中靜態(tài)地創(chuàng)建一個單例對象,保證了在程序運行期間只會創(chuàng)建一個實例。這種方式的缺點是無法進行延遲加載,即使程序不需要使用該單例對象也會被創(chuàng)建。
class Singleton {
private:
    static Singleton* instance;
    Singleton() {}

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

Singleton* Singleton::instance = nullptr;
  1. 懶漢式單例模式(Lazy Initialization): 在第一次使用該單例對象時才創(chuàng)建實例。這種方式可以實現(xiàn)延遲加載,但需要考慮線程安全問題。
class Singleton {
private:
    static Singleton* instance;
    Singleton() {}

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

Singleton* Singleton::instance = nullptr;
  1. 雙重檢查鎖定(Double-checked Locking): 在懶漢式的基礎(chǔ)上增加了同步鎖,解決了線程安全問題,同時也保持了延遲加載的特性。
class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx; // 互斥鎖
    Singleton() {}

public:
    static Singleton* getInstance() {
        if(instance == nullptr) {
            std::lock_guard<std::mutex> lock(mtx); // 上鎖
            if(instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
  1. 靜態(tài)局部變量(Local Static): 利用局部靜態(tài)變量的特性,可以在函數(shù)內(nèi)部定義一個靜態(tài)局部變量,保證了只有在第一次調(diào)用該函數(shù)時才實例化單例對象。這種方式也是線程安全的。
class Singleton {
private:
    Singleton() {}

public:
    static Singleton* getInstance() {
        static Singleton instance;
        return &instance;
    }
};

這些是常見的幾種單例模式的實現(xiàn)方式,選擇哪種方式取決于具體的需求和場景。

0