您的位置:首页 > 其它

单例模式

2015-08-06 20:47 253 查看
保证一个类只有一个实例,并提供一个访问它的全局访问点。首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;最后,需要提供要给全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。

意思很明白,使用UML类图表示如下:





特点:

1.单例类只能有一个实例。

2.单例类必须自己创建自己的唯一实例。

3.单例类必须给所有其它对象提供这一实例。

适用情况:

使用Singleton模式有一个必要条件: 在一个系统要求一个类只有一个实例时才应当使用单例模式。 反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

C++代码实现:

//单例模式Demo1

#include<iostream>

using namespace std;

class singleton

{

private:

static singleton *s;

singleton(){cout<<"hello"<<endl;}

public:

static singleton* getObj()

{

if(s==NULL)

return s=new singleton();

else

return s;

}

};

singleton* singleton::s=0;

int main()

{

singleton *s1=singleton::getObj();

singleton *s2=singleton::getObj();

if(s1==s2)

cout<<"the same"<<endl;

else

cout<<"not same"<<endl;

return 0;

}

以上在多线程环境中并不能保证只创建一个对象,在多线程下实现单例模式,网上很多使用的方法是加锁,Lock(),发现一个比较好的方法,在此贴出:

原文地址:http://www.jellythink.com/archives/82

//单例模式 Demo2

#include<iostream>

using namespace std;

class singleton

{

private:

singleton(){cout<<"hello"<<endl;}

public:

static singleton* getObj()

{

static singleton obj;

}

};

int main()

{

singleton *s1=singleton::getObj();

singleton *s2=singleton::getObj();

if(s1==s2)

cout<<"the same"<<endl;

else

cout<<"not same"<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: