单例模式
单例模式是一种创建型的设计模式,使用单例模式进行设计的类在程序中只有一个实例,并且在程序的任何地方都可以调用到,这个类称为单例类。
单例模式又分为懒汉模式和饿汉模式
饿汉模式
饿汉模式是指在类加载的时候就创建对象,直接将对象实例化完毕,资源申请完毕,在使用的时候可以直接使用
优点:效率高,资源使用的时候可以直接使用
缺点:程序初始化满,资源占用多
代码:
#include<iostream>
using namespace std;
//饿汉模式
class Signleton
{
private:
int _data;
private:
static Signleton _eton;
Signleton() //构造函数私有化,目的是该类只能实例化一个对象
{
_data = 10;
}
public:
static Signleton* Getinstance()
{
return &_eton; //返回对象的地址
}
int GetData()
{
return _data;
}
};
Signleton Signleton::_eton;
int main()
{
Signleton* p = Signleton::Getinstance(); //用指针访问对象
cout << p->GetData() << endl;
return 0;
}

懒汉模式
懒汉模式是指在使用的时候才创建单例对象,即资源用到的时候在去申请
优点:程序初始化速度快,资源占用少
缺点:第一次访问对象时候速度较慢,而且存在线程安全问题
代码:
#include<iostream>
#include<mutex>
using namespace std;
//懒汉模式
class Signleton
{
private:
int _data;
private:
static Signleton* _eton;
static mutex _mutex;
Signleton()
{
_data = 100;
}
public:
static Signleton* Getistance()
{
if (_eton == nullptr)
{
//如果有多个线程同时访问,会同时判断_eton为空,就会创建多个对象,不符合
//所以需要进行加锁操作
_mutex.lock();
if (_eton == nullptr)
{
_eton = new Signleton();
}
_mutex.unlock();
}
return _eton;
}
int GetData()
{
return _data;
}
};
Signleton* Signleton::_eton = nullptr;
mutex Signleton::_mutex;
int main()
{
Signleton* p = Signleton::Getistance();
cout << p->GetData() << endl;
return 0;
}
