C++的单例模式
一、要点:
二、实现:
//way(1)
class singleton
{
public:
static bool flag;
static singleton*great()
{
if (flag== 1)
{
flag =0; //创建一个对象后,把记录对象个数的flag清零,下次再就不能再继续创建对象了。
return(new singleton);
}
else
{
return NULL;
}
}
~singleton()
{
flag = 1;
}
private:
singleton(){}/*实例化一个对象时,实质是在类外调用构造函数来构建对象,只能通过this->指针或者“对象+点”的方式调用
而私有的构造函数活动范围只是在类内的,我们无法在类外直接用它创建对象,这时,可以在类内
定义一个函数great()(主意,这个函数必须是不属于类的,否则我们在类外同样无法调用它来构建对象)
来调用构造函数,不属于类的函数有static和protectd,所以我们定义这个函数为static的,这样我们在类外就可以
调用great()函数(它间接调用私有的构造函数)来创建一个对象了*/
};
bool singleton::flag=1;
int main()
{
//只能创建一个对象
singleton *s1 = singleton::great();
cout <<s1 << endl;//0073A070 //第一次创建s1时合法
singleton *s2 = singleton::great();
cout <<s2 << endl;//00000000 //第二次创建s2时合法,s2的值为NULL,则对象s2是无效,不能使用s2
singleton *s3 = singleton::great();
delete s3;
singleton *s4 = singleton::great();
cout <<s4 << endl;//005BA570 //创建S3,然后在销毁S3(回到原始状态,相当于做无用功),而这时S4则是合法有效的,可以使用它
system("pause");
return 0;
}
//way(2)
classCSingleton
{
private:
CSingleton()
{
}
static CSingleton *m_pInstance;
class CGarbo
{
public:
~CGarbo()
{
if(CSingleton::m_pInstance)
deleteCSingleton::m_pInstance;
}
};
static CGarbo Garbo;
public:
static CSingleton * GetInstance()
{
if(m_pInstance == NULL)
m_pInstance = newCSingleton();
return m_pInstance;
}
};
在程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。使用这种方法释放单例对象有以下特征:
1.在单例类内部定义专有的嵌套类。
2.在单例类内定义私有的专门用于释放的静态成员。
3.利用程序在结束时析构全局变量的特性,选择最终的释放时机