概念:单例模式即在单例类实例化对象的时候只能实例化出来一个对象。
单例模式实现的要点:
- 单例类只能实例化出来一个单例对象
- 必须能够自行创建实例对象
- 必须能够向整个系统提供这个实力对象
单例模式的优点:
- 单例模式只能够创建一个对象,所以在资源方面可以做到节约内存资源
- 单例模式不需要频繁的销毁和创建,所以在效率方面有所提高
- 单例对象在整个系统里面只有一份,可以做到避免共享资源的重复占用
- 单例模式的对象必须可以向整个系统提供,所以可以做到全局
实现单例模式的方法有饿汉式和懒汉式两种方法:
- 饿汉式是在单例类创建单例对象的时候就new出来对象空间
- 懒汉式是在调用get方法的时候才new出来对象空间
单线程下面的懒汉式
#include<iostream>
using namespace std;
class singleton{
public:
static singleton* GetInstance(){
static singleton* pinstace; //定义静态单例对象的指针
if(NULL == pinstance) //判断pinstace是否初始化
pinstace = new singleton();
return pinstance;
}
private:
singleton(){} //私有的构造函数
};
注:这个 类在单线程系统里面是没有问题的,但是在多线程系统里面就会出现问题,假如在多线程里面有两个线程同时运行单例类,这样的话在if语句判断的时候就会假象的以为pinstance为NULL,那么在系统里面创建的单例类就会出现两个 单例对象。
改进的懒汉式单例模式:
class singleton{
public:
static singleton* GetInstance(){
lock();//加上信号量互斥机制,给代码上锁
static singleton* pinstace;
if(NULL == pinstance)
pinstace = new singleton();
unlock();
return pinstance;
}
private:
singleton(){}
};
注:懒汉式的单例模式是以空间换时间的方法
饿汉式的单例模式
class singleton{
public:
static singleton* GetInstance(){
return instace;
}
private:
static instace = new singleton();
singleton(){}
};
注:这样并不是一个好的做法,可以将静态变量来封装成一个类,利用封装的类来操作,这样可以更好的做到类的封装性。
class SingleTon;
SingleTon* getSingleTonInstance(){
static SingleTon* instance = new SingleTon();
return instance;
}
class SingleTon{
friend SingleTon* getSingleTonInstance();
private:
SingleTon(){}
};
注:在这上面的实现单例模式的方法中,存在做大的问题就是内存泄漏。
解决这个问题的方法可以在单例类里面定义一个镶嵌的内部类来解决。
class singleton{
public:
static singleton* GetInstance(){
lock();
static singleton* pinstace;
if(NULL == pinstance)
pinstace = new singleton();
unlock();
return pinstance;
}
class Del{
~Del(){
if(singleton::instance != NULL){
delete singleton::instance;
}
}
}
private:
static Del del;
singleton(){}
};
当内嵌类的对象被销毁的时候就会调用该对象的析构函数,从而达到销毁单例对象的空间。