只能创建出一个对象的类叫单例模式。
单例模式的应用场景:
1、Windows系统的任务管理器。
2、Linux\UNIX系统的日志管理系统。
3、网站的访问计数器。
4、服务器的连接池、线程池、数据池等。
创建单一对象的方法:
1、定义全局的,但不受控制,且有再次创建的风险。
2、专门实现一个类,把类的构造函数调用为私有,然后借助静态成员函数提供一个获取唯一对象的接口。
C++实现单例的思路:
1、禁止类外创建类对象:把构造和拷贝构造设置为私有的。
2、类自己维护一个对象:使用静态指针或静态对象。
3、提供一个获取实例的方法:使用静态成员函数获取静态对象。
懒汉模式:
用静态成员指针来指向唯一的单例对象,只有真正调用单例接口时才创建对象。
优点:什么时候用什么时候创建,节约内存、资源。
缺点:只有在调用获取接口时才创建对象,当多个线程同时调用该接口时,可能会创建出多个对象,存在线程不安全问题。
#include <iostream>
using namespace std;
class Single
{
static Single* single;
Single(void) {}
Single(const Single& that) {}
public:
static Single* get_single(void)
{
if(NULL == single)
{
single = new Single;
}
return single;
}
void show(void)
{
cout << single << endl;
}
};
Single* Single::single = NULL;
void func(Single& t)
{
cout << &t << endl;
}
int main(int argc,const char* argv[])
{
Single* s = Single::get_single();
s->show();
func(*s);
}
饿汉模式:
将单例对象设置为类的静态成员变量,在main函数开始运行前,实例对象就已经创建完成。
优点:获取单例对象时,线程安全。
缺点:无论是否使用,单例对象都已经创建完成,浪费内存、资源。
#include <iostream>
using namespace std;
class Single
{
static Single single;
Single(void)
{
cout << this << endl;
cout << "我是单例构造函数" << endl;
}
Single(const Single& that) {}
public:
static Single& get_single(void)
{
return single;
}
};
Single Single::single;
int main(int argc,const char* argv[])
{
cout << "hehe" << endl;
Single& s = Single::get_single();
cout << &s << endl;
Single& s1 = Single::get_single();
cout << &s1 << endl;
}