单例模式
对于一个东西在整个系统,全局上只有一个,比如电脑的任务管理器,无论你按多少次Ctrl + Alt + Del
都会只打开同一个窗口。
将任务管理抽象为一个类的话,单例模式也就是一个类全局只有一个实例,这个类要提供一个全局的访问点。
单例模式可以控制类实例的数目,节省系统资源。能避免一个全局使用的类频繁被创建和销毁带来的开销。
单例模式实现步骤
1、构造私有化,使类不能实例化
2、增加静态私有的当前类的指针
3、提供静态的对外接口,可以让用户得到单例对象
两种不同实现方式的单例模式
1、懒汉式
需要对象的时候才创建
class SingletonPattern
{
private:
SingletonPattern();
static SingletonPattern *sp;
public:
void showName(void);
static SingletonPattern *getInstance(); //由于构造私有,类不能被实例化,所以提供全局访问的函数必须是静态函数,通过类名就可以访问
};
SingletonPattern *SingletonPattern::sp = NULL;
SingletonPattern::SingletonPattern()
{
}
SingletonPattern *SingletonPattern::getInstance()
{
if (sp == NULL)
sp = new SingletonPattern; //需要时才创建
return sp;
}
void SingletonPattern::showName(void)
{
cout << "单例模式" << endl;
}
懒汉式在多线程情况下是不安全的,当两个线程都试图获得单例对象时,所以的单例模式就不存在了。在多线程下使用懒汉式就要加锁。
2、饿汉式
类创建时就已经在类外初始化创建好单例对象。
class SingletonPattern
{
private:
SingletonPattern();
static SingletonPattern *sp;
public:
void showName(void);
static SingletonPattern *getInstance();
};
SingletonPattern *SingletonPattern::sp = new SingletonPattern;//类创建时就已经创建好单例对象
SingletonPattern::SingletonPattern()
{
}
SingletonPattern *SingletonPattern::getInstance()
{
return sp;
}
void SingletonPattern::showName(void)
{
cout << "单例模式" << endl;
}
饿汉式在多线程下是安全的,单例对象在线程执行前就已经创建好了,全局只有一个,调用函数获取单例对象也只有一个。
单例模式对象释放的问题
因为单例模式对象全局只有一个,对象在堆区创建,程序运行结束系统会自动释放回收,所以不需要手动释放。