一,单例模式
单例模式是设计模式中的一种,本文主要介绍单例模式。
单例模式核心:一个类只能创建一个对象,保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
事例:在某个服务器中,该服务器的配置信息放在一个文件,这些数据必须由一个单例对象读取,其他对象通过这个单例对象过去配置,这样设计的话,节约了大量时间。
单例之饿汉模式:
直接上代码:
#include<iostream>
class Singleton
{
public:
static Singleton *GetInstance()
{
return &m_instance;
}
private:
//构造函数私有
Singleton ();
//拷贝构造函数私有,防拷贝
Singleton (const Singleton &);
Singleton& operator=(const Singleton&);
//初始化,必须为static
static Singleton m_instance;
};
Singleton Singleton::m_instance;
int main()
{
return 0;
}
优点:设计简单
缺点:每次登陆都要初始化,耗费时间,资源竞争高,速度慢
单例之懒汉模式:
#include<iostream>
#include<mutex>
using namespace std;
class Singleton
{
public:
static Singleton *GetInstance()
{
if(m_Pinstance == nullptr)
{
//防止重复加锁(例如:多线程)
m_mtx.lock();
if(nullptr == m_Pinstance)
{
m_Pinstance = new Singleton;
}
m_mtx.unlock();
}
return m_Pinstance;
}
//回收类,类类型的好处是,它是Singleton 的友元类,可以访问外部类,而外部类不能访问它。
class CGarbo{
public:
~CGarbo()
{
if(Singleton::m_Pinstance)
{
delete Singleton::m_Pinstance;
}
}
};
//定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
static CGarbo Garbo;
private:
//构造函数私有,所以只能调一次构造函数
Singleton ();
//防止构造拷贝
Singleton operator=(const Singleton&);
static Singleton *m_Pinstance;
static mutex m_mtx;
};
Singleton* Singleton::m_Pinstance = nullptr;
Singleton:: CGarbo Garbo;
mutex Singleton::m_mtx;
int main()
{
return 0;
}
优点:就是饿汉的缺点。
重点:饿汉每次都要初始化,而懒汉指初始化一次