单例模式
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;
}
意思很明白,使用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;
}
相关文章推荐
- 暑期校园生活中的那些烦心事!
- java中包的应用
- PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
- 九度OJ 题目1031:xxx定律
- Type Java compiler level does not match the version of the instalj解决方案
- Jenkins hash算法
- Catch That Cow (BFS)
- 机器学习 之 libsvm 参数说明
- CLR程序集-怎么把一个dll注册到SQL SEVER
- 1.设计模式概述
- EJB学习笔记十一(EntityManager几种管理方式)
- 屏保
- Doing Homework again SDUT 2076
- 纵向表和横向表
- 使用DPM(Deformable Part Model,voc-release3.1)算法INRIA通过训练你的身体检测模型数据集
- (剑指Offer)面试题58:二叉树的下一个结点
- BZOJ4025 : 二分图
- 九大排序算法总结
- CodeForces #Pi D.One-Dimensional Battle Ships
- 数据离散化