单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。
单例模式分类
单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同:

线程不安全版本:
-
- //线程不安全的懒汉模式
- class singleClass {
- public:
-
- static singleClass* getinstance()//对外的接口(方法),静态成员函数调用静态成员变量
- {
- if (instance == nullptr)
- {
- instance = new singleClass();
- }
- return instance;
- };
-
- private:
- static singleClass* instance;//静态成员变量,类内声明,类外初始化
- singleClass() {} //构造函数属性设置为私有
-
- singleClass(const singleClass & sc) {} //拷贝构造函数也需要设置为私有
- };
- singleClass* singleClass::instance=nullptr;//初始化静态变量
- //线程安全的懒汉模式
- class lhsingleClass {
- public:
-
- static lhsingleClass* getinstance()
- {//双重锁模式
- if (instance == nullptr)
- {//先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回
- //进入后加锁
- i_mutex.lock();
- if (instance == nullptr)
- {//再判断一次,确保不会因为加锁期间多个线程同时进入
- instance = new lhsingleClass();
- }
- i_mutex.unlock();//解锁
- }
- return instance;
- }
- private:
- static lhsingleClass* instance;
- static mutex i_mutex;//锁
- lhsingleClass(){}
- lhsingleClass(const lhsingleClass& sc) {}//拷贝构造函数也需要设置为私有
- };
- lhsingleClass* lhsingleClass::instance=nullptr;
- mutex lhsingleClass::i_mutex;//类外初始化
- //饿汉模式:不管用不用得到,都构造出来。本身就是线程安全的
- class ehsingleClass {
- public:
- static ehsingleClass* getinstance()
- {
- return instance;
- }
-
- private:
- static ehsingleClass* instance;//静态成员变量必须类外初始化,只有一个
- ehsingleClass() {}
- };
- ehsingleClass* ehsingleClass::instance = new ehsingleClass();
- //类外定义,main开始执行前,该对象就存在了