单例模式:确保一个类只有一个实例,并提供一个全局访问点。这些类比如包括:线程池,缓存,对话框,处理偏好设置,注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。
要点:
1.单例模式确保程序中一个类最多只有一个实例
2.单例模式也提供访问这个实例的全局点
3.确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程问题
4.如果使用多个类加载器,可能导致单例失效而产生多个实例
如果性能对应用程序不是很关键:
#include<iostream>
#include<stdlib.h>
using namespace std;
class Singleton{
private:
Singleton(){}
public:
static Singleton* singleton;
static Singleton* getInstance(){
if(singleton==NULL){
singleton = new Singleton;//程序将会走这一行
}
return singleton;
}
void fun(){
cout << "this is a singleton" << endl;
}
};
//注意静态变量得在外面初始化
Singleton* Singleton::singleton = NULL;
int main(){
Singleton::getInstance()->fun();
}
如果使用总是很急切,就不用延迟实例化
#include<iostream>
#include<stdlib.h>
using namespace std;
class Singleton{
private:
Singleton(){}
public:
static Singleton* singleton;
static Singleton* getInstance(){
return singleton;
}
void fun(){
cout << "this is a singleton" << endl;
}
};
//直接实例化,不延迟
Singleton* Singleton::singleton = new Singleton;
int main(){
Singleton::getInstance()->fun();
}
多线程
#include<iostream>
#include<auto_ptr.h>
using namespace std;
class Singleton{
private:
Singleton(){}
public:
static Singleton* getInstance(){
typedef auto_ptr<Singleton> singletonPtr;
static singletonPtr singleton;
if(singleton.get()==NULL){
singleton.reset(new Singleton);
}
return singleton.get();
}
void fun(){
cout << "this is a singleton" << endl;
}
};
int main()
{
Singleton::getInstance()->fun();
}