c++單例模式怎么實(shí)現(xiàn)

c++
小億
102
2023-10-13 10:12:07
欄目: 編程語言

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

  1. 餓漢式(Eager Initialization):
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有構(gòu)造函數(shù),防止類外實(shí)例化對(duì)象
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton();

在該實(shí)現(xiàn)方式中,單例對(duì)象在程序啟動(dòng)時(shí)就被創(chuàng)建出來,因此稱為“餓漢式”。在調(diào)用getInstance()方法時(shí),直接返回已創(chuàng)建好的實(shí)例。

  1. 懶漢式(Lazy Initialization):
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有構(gòu)造函數(shù),防止類外實(shí)例化對(duì)象
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;

在該實(shí)現(xiàn)方式中,單例對(duì)象在第一次調(diào)用getInstance()方法時(shí)才被創(chuàng)建出來,因此稱為“懶漢式”。通過判斷instance是否為nullptr,來判斷是否已經(jīng)創(chuàng)建實(shí)例,如果是則創(chuàng)建實(shí)例,如果不是則直接返回實(shí)例。

  1. 雙檢鎖(Double-Checked Locking):
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {} // 私有構(gòu)造函數(shù),防止類外實(shí)例化對(duì)象
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;

在該實(shí)現(xiàn)方式中,通過使用雙重檢查鎖定來保證線程安全。首先判斷instance是否為nullptr,如果是則加鎖,再次判斷instance是否為nullptr,如果是則創(chuàng)建實(shí)例。通過使用std::mutex來實(shí)現(xiàn)線程同步。

以上是幾種常見的單例模式實(shí)現(xiàn)方式,具體選擇哪種方式取決于實(shí)際需求和場(chǎng)景。

0