1)C++入门级小知识,分享给将要学习或者正在学习C++开发的同学。
2)内容属于原创,若转载,请说明出处。
3)提供相关问题有偿答疑和支持。
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。
另外需要注意一个问题是:
在c++中不允许在类中定义自身类的对象,但是允许类中定义自身类的指针以及引用:
以上原因在于定义一个指针类型仅仅是占用4字节,在类中仅仅是占个位置,并且要是用指针a的话需要为其分配空间,在分配空间的时候会真正的实例化;
如下是单例模式的基础模型:
class CSingleton
{
private:
CSingleton() //构造函数是私有的
{
}
static CSingleton *m_pInstance;
public:
static CSingleton * GetInstance()
{
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};
用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。
GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针;
如下:当释放的时候会出现double释放的异常,说明不管创建多少实例都只能拿到一个相同的实例:
懒汉模式:
实例1(拷贝构造创建对象)
实例2:(只能通过引用来访问对象实例)
有一种情况是,假如有两个人都各自拿到一个实例,一个人用完了调用delInstance接口将实例释放,那么另外一个人使用的时候就会出现异常,因此为了解决这个问题,我们引入一个计数器,当所有的人都不在使用的时候才去真正的去释放掉;如下:
对于这种单例的使用还要注意一个问题就多线程并发访问的问题:需要加锁
饿汉模式:(程序运行起来以后就创建了,不管用户使用或者是不使用,如下面的对象a就是一直存在)