饿汉模式:
缺点:不使用的时候占用资源,不支持向单例构造函数传参;
优点:不存在多线程的实例化,线程安全,提前加载单例 节省运行时间;
template <class T>
class Singleton
{
private:
static T* _instance;
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static T* instance() { return _instance; }
};
template <class T>
T* Singleton<T>::_instance = new T();
懒汉模式
1、普通版:
template <class T>
class Singleton
{
private:
static T* _instance;
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static T* instance()
{
if (!_instance)
{
_instance = new T();
}
return _instance;
}
};
template <class T>
T* Singleton<T>::_instance = NULL;
2、线程安全版:
template<class T>
class Singleton {
public:
template <typename... Args>
static T* instance(Args&& ..args) {
std::call_once(_flag, [&]() {_instance = new T(std::forward<Args>(args)...); });
return _instance;
}
private:
static T* _instance;
static std::once_flag _flag;
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton& single) = delete;
const Singleton& operator=(const Singleton& single) = delete;
};
template <class T>
T* Singleton<T>::_instance = NULL;
template <class T>
std::once_flag Singleton<T>::_flag;
代码转载来源:单例模式