单例类可分为线程安全和非线程安全的两种,下面分别介绍两种实现单例的方式:
1. 实现一个单例(非线程安全)
class Singleton {
public:
Singleton(const Singleton &singleton) = delete;
const Singleton &operator=(const Singleton &) = delete;
static Singleton &Get() {
static Singleton singleton;
return singleton;
}
static int getInt() {
return Get().getInt_();
}
float getFloat() {
return number;
}
private:
Singleton() = default;
int getInt_() {
return numberInt;
}
int numberInt = 10;
float number = 0.5f;
};
2. 实现一个单例(使用std::lock_guard保证线程安全)
#include <iostream>
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mutex;
Singleton() = default;
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
void showMessage() {
std::cout << "Hello, I am a singleton object!" << std::endl;
}
};
#include "Singleton.h"
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
3. 实现一个单例(使用std::call_once保证只初始化一次)
#include <iostream>
class SingletonApp {
private:
SingletonApp()= default;
public:
static SingletonApp* getInstance();
void showMessage() {
std::cout<<this<<std::endl;
}
};
#include "SingletonApp.h"
SingletonApp *SingletonApp::getInstance() {
static SingletonApp* instance;
static std::once_flag flag;
std::call_once(flag, []{
instance = new SingletonApp();
});
return instance;
}