您的位置:首页 > 其它

设计模式:单例模式

2016-01-25 13:21 253 查看
单例模式即保证类只能有一个实例,比如一个系统日志就需要使用单例模式;单例模式中将类的构造函数声明为private或protected,保证类外无法声明该类的对象,然后提供一个公有的静态方法获取私有的静态成员。虽然可以利用全局变量,程序中所有地方都能使用,但是全局变量不能确保只有一个实例。

#include<iostream>
using namespace std;
class Singleton{
public:
static Singleton* getSingleton(){
if(singleton==NULL){
singleton=new Singleton();
return singleton;
}
}
static void destorySingleton(){
if(singleton!=NULL){
delete singleton;
singleton=NULL;
}
}
private:
Singleton(){}//构造函数设置为私有,防止类外被调用
static Singleton* singleton;

};
Singleton* Singleton::singleton=NULL;//注意定义时不能有static

int main(){
Singleton* tmp1=Singleton::getSingleton();
tmp1->destorySingleton();
}
这种方法必须显式调用destorySingleton函数来析构new出来的singleton成员,很多人容易忘记调用它,所以想办法让我们不用去关心资源的释放。

这里可以使用程序退出时会自动调用全局变量的析构函数的特性:由于类的静态成员变量也是存储在全局区(静态区),程序退出时也会调用它们的析构函数。

我们可以在单例类中在声明一个回收类,并且声明一个回收类型静态成员。

如下:

#include<iostream>
using namespace std;
class Singleton{
public:
static Singleton* getSingleton(){
if(singleton==NULL){
singleton=new Singleton();
return singleton;
}
}
private:
Singleton(){}//构造函数设置为私有,防止类外被调用
static Singleton* singleton;
//设置一个回收类,它的析构函数帮忙析构单例类的singleton成员
class HelpDelete{
public:
~HelpDelete(){
if(Singleton::singleton!=NULL){
cout<<"I help to delete Singleton::singleton"<<endl;
delete singleton;
singleton=NULL;
}
}
};
static HelpDelete aHelpDelete;
};
Singleton* Singleton::singleton=NULL;//注意定义时不能有static
Singleton::HelpDelete Singleton::aHelpDelete;
int main(){
Singleton* tmp1=Singleton::getSingleton();
return 0;
}
回收类的析构函数中delete单例类的singleton成员。这样一来,我们就不用关心资源释放问题了。

前面的方法都是使用new来产生singleton,也可以使用返回静态局部变量的地址来实现:

#include<iostream>
using namespace std;
class Singleton{
public:
static Singleton* getSingleton(){
static Singleton singleton;
return &singleton;
}
private:
Singleton(){
}
};
int main(){
Singleton* tmp1=Singleton::getSingleton();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: