保證一個類別僅有一個實例,並提供一個存取它的全域存取點。

new。m_pStatic)。GetInstance() 提供全域存取,首次呼叫時延遲建構。Singleton::GetInstance(),無需物件實例。#ifndef SINGLETON_H
#define SINGLETON_H
class Singleton {
public:
Singleton() {}
~Singleton() {}
static Singleton* GetInstancePtr();
static Singleton GetInstance();
void Test();
private:
static Singleton* m_pStatic;
};
#endif
#include "Singleton.h"
#include <iostream>
Singleton* Singleton::m_pStatic = nullptr;
Singleton* Singleton::GetInstancePtr() {
if (!m_pStatic) m_pStatic = new Singleton();
return m_pStatic;
}
Singleton Singleton::GetInstance() { return *GetInstancePtr(); }
void Singleton::Test() { std::cout << "Test!\n"; }
#include "Singleton.h"
#include <cstdlib>
int main() {
Singleton::GetInstancePtr()->Test();
Singleton::GetInstance().Test();
return 0;
}
std::mutex mtx;
Singleton* Singleton::GetInstancePtr() {
if (!m_pStatic) {
std::lock_guard<std::mutex> lock(mtx);
if (!m_pStatic) m_pStatic = new Singleton();
}
return m_pStatic;
}
Singleton& Singleton::GetInstance() {
static Singleton instance; // 執行緒安全、自動釋放
return instance;
}
template <typename T>
class Singleton {
protected:
Singleton() {}
~Singleton() {}
public:
static T& Instance() {
static T instance;
return instance;
}
};
// 使用
class MyService : public Singleton<MyService> {
friend class Singleton<MyService>;
MyService() {}
};
MyService::Instance().DoWork();