单例模式
什么是单例模式
只能创建出一个对象的结构、联合、类叫单例模式。
什么时候需要使用单例模式
1、Windows系统的任务管理器。
2、网络或服务器程序的访问计数器。
3、线程池、数据池,一个程序中只能创建一个线程池或数据池。
单例模式的实现原理
1、把构造函数、拷贝构造设置成私有的,不允许创建类对象。
2、在类中声明+定义一个静态的类对象(饿汉单例) 或类对象指针(懒汉单例)。
3、提供一个静态成员接口,用于获取静态的类对象。
饿汉单例模式
只要程序一运行,就把单例类的类对象创建出来,不管后续是否使用到。
缺点:如果后续程序使用不到单例对象,就造成了资源、时间上的浪费。
优点:线程安全,再多的线程也不可能创建出多个类对象。
懒汉单例
直到调用获取单例类对象的接口才会把对象创建出来。
缺点:如果在多线程情况下,多个线程同时调用对象的获取接口,可能会创建出多个类对象。
优点:如果用不到单例对象就不会真正创建,节约资源和时间。
单例模式的实现原理
1、把构造函数、拷贝构造设置成私有的,不允许创建类对象。
2、在类中声明+定义一个静态的类对象(饿汉单例) 或类对象指针(懒汉单例)。
3、提供一个静态成员接口,用于获取静态的类对象。
练习1:实现饿汉单例模式。
#include <iostream>
using namespace std;
class HungrySingle
{
// 声明静态对象
static HungrySingle obj;
// 把构造和拷贝构造设置为private,可以防止创建类对象
HungrySingle(void)
{
cout << "创建了类对象" << endl;
}
HungrySingle(const HungrySingle& that) {}
public:
// 只能调用该接口获取静态类对象
static HungrySingle& getSingleObject(void)
{
return obj;
}
void show(void)
{
cout << this << endl;
}
};
// 定义静态对象
HungrySingle HungrySingle::obj;
int main(int argc,const char* argv[])
{
cout << "main run ..." << endl;
HungrySingle& h1 = HungrySingle::getSingleObject();
HungrySingle& h2 = HungrySingle::getSingleObject();
HungrySingle& h3 = HungrySingle::getSingleObject();
h1.show();
h2.show();
h3.show();
return 0;
}
练习2:实现懒汉单例模式。
#include <iostream>
using namespace std;
class LazySingle
{
static LazySingle* obj;
LazySingle(void)
{
cout << "创建单例对象" << endl;
}
LazySingle(const LazySingle& that)
{
}
public:
static LazySingle* getSingleObject(void)
{
if(NULL == obj)
{
obj = new LazySingle;
}
return obj;
}
void show(void)
{
cout << this << endl;
}
};
LazySingle* LazySingle::obj;
int main(int argc,const char* argv[])
{
cout << "main run ..." << endl;
LazySingle* l1 = LazySingle::getSingleObject();
LazySingle* l2 = LazySingle::getSingleObject();
LazySingle* l3 = LazySingle::getSingleObject();
l1->show();
l2->show();
l3->show();
return 0;
}
1141

被折叠的 条评论
为什么被折叠?



