单例模式是一种软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类,通过单例模式可以保证系统中一个类只有一个实例,而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源
如何保证一个类只有一个实例并且这个实例易于被访问?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。更好的办法是让类自身负责保存它的唯一实例,这个类可以保证没有其他实例被创建,并且它提供一个访问该实例的方法
实现方式:饿汉模式,懒汉模式
饿汉模式,
优点:简单,
缺点:初始化慢
class Singleton
{
public:
static Singleton* GetInstance()
{
return &_sInstance;
}
private:
Singleton()
{}
Singleton(const Sinleton*)=delete;
Singleton& operator=(const Singleton&)=delete;
static Singleton _sInstance;
};
//饿汉,饿在main函数前,这个唯一的对象就已经创建好了
Singleton Singleton::_sInstance;
int main()
{}
懒汉模式
优点:第一次使用实例对象,,才创建对象
缺点:复杂
class Singleton
{
public:
static Singleton* GetInstance()
{
if(_spInstance==nullptr)
{
_smtx.lock();//如果不加锁,两个线程并行过来,就创建了两个对象了
if(_spInstance==nullptr)
_spInctance=new Singleton;
_smtx.unlock();
}
return _spInstance;
}
private:
Singleton()=delete;
Singleton(const Singleton*)=delete;
static Singleton* _spInstance;
};
Singleton Singleton::*_spInstance=nullptr;
int main()
{}
单例模式的优缺点:
优点:
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例
缺点:
每次对象请求引用时都要检查是否存在类的实例,需要一些开销,通过使用静态初始化解决此问题。使用单例对象时,编程人员不能使用new关键字实例化对象。如果同意类型的对象总是要在不同的场景发生变化,单例就会引起数据的错误,不能保存彼此的状态