单例模式
参考链接
简介
-
介绍 单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。特点有:
-
在任何情况下,单例类永远只有一个实例存在
- 单例需要有能力为整个系统提供这一唯一实例
所以说需要做
- 构造函数应该声名为私有
-
拷贝构造、赋值构造、移动构造都应该禁止
-
适用场景
打印机,任务管理器等等
UML类图
示例
懒汉式
简单示例,懒汉就是只有用到的时候才会创建,不支持多线程,优化需要加互斥锁
class CSingleton
{
public:
static CSingleton* GetInstance() {
if ( m_pInstance == NULL )
m_pInstance = new CSingleton();
return m_pInstance;
}
private:
CSingleton() {};
static CSingleton * m_pInstance;
}
饿汉式
简单示例,饿汉就是程序开始就创建,不支持多线程,优化需要加互斥锁
class CSingleton
{
private:
CSingleton() {}
public:
static CSingleton * GetInstance() {
static CSingleton instance;
return &instance;
}
};
最优实现
C++11起,Singleton 最佳实现是静态局部对象的方法,。优势有这些
- 延迟加载,保证不用到就不会构造这个类,只会在第一次用到时构造,属于懒汉式
- 该方法是线程安全的。C++11标准保证:如果多个线程试图同时初始化同一静态局部对象,则初始化严格只发生一次
缺点有:
- gcc 4.0之后的编译器支持这种写法
- C++11及以后的版本(如C++14)的多线程下,正确
#include <iostream>
class Singleton
{
public:
static Singleton &get_instance() {
static Singleton value;
return value;
}
~Singleton() {
std::cout << "~Singleton()" << std::endl;
}
private:
Singleton() {
std::cout << "Singleton()" << std::endl;
}
Singleton(Singleton &obj) = delete;
Singleton(const Singleton &obj) = delete;
Singleton(Singleton &&obj) = delete;
Singleton(const Singleton &&obj) = delete;
Singleton operator=(Singleton &obj) = delete;
Singleton operator=(const Singleton &obj) = delete;
};
#define RETURN_FAIL(state, ret) \
if (!(state)) { \
std::cout << #state << " execute failed" << std::endl; \
return (ret); \
}
int main()
{
Singleton &signleton = Singleton::get_instance();
return 0;
}