单例模式的作用:只创建一个类的实例。
有时候,在程序设计中,我们只想产生一个类的实例,那么只用调用一次new MyClass(),就可以达到目的。但是,如果我们不想“必须多加注意才能确保生成一个实例”,而是要达到如下目的时:
1、想确保任何情况下都绝对只有1个实例。
2、想在程序上表现出“只存在一个实例”。
像这样的确保只生成一个实例的模式被称为单例模式Singleton。
示例代码如下:
#include<iostream>
using namespace std;
//单例模式
//构造函数私有化
//提供一个全局的静态变量方法
//在类中定义一个全局的指针
class Singelton
{
private:
Singelton()//构造函数私有化
{
}
public:
static Singelton* GetSingelton()//提供一个全局的访问点
{
/*
//此写法不能保证单例,必须加上判断
return new Singelton();
*/
if(singel==NULL)
{//每一次都需要判断该单例是否存在?
singel=new Singelton();
}
return singel;
}
private:
static Singelton* singel;
};
Singelton* Singelton::singel=NULL;//在类外对类中的数据成员进行初始化
int main()
{
//目的:不希望客户调用构造函数;不希望客户构造两个同类型的对象,防止资源浪费。
//Singelton* p1=new Singelton;//出错,构造函数已经私有化。
//Singelton* p2=new Singelton;
Singelton* p1=Singelton::GetSingelton();
Singelton* p2=Singelton::GetSingelton();
if(p1==p2)
{
cout<<"p1==p2"<<endl;
}
else
{
cout<<"p1!=p2"<<endl;
}
return 0;
}
//分析
//此模式为典型的懒汉模式,因为只有在GetSingelton()这个函数被调用时,
//才会new一个单例。
//缺点:new时才会调用构造函数,C++的构造函数不是线程安全的。
执行上述程序,运行结果如下图所示: