设计模式之个人理解--单例模式
2009-12-02 16:07 杨兴亚 阅读(1632) 评论(12) 编辑 收藏 举报单例模式
面向过程(C)语言中可以在程序中应用全局变量,而面向对象(C++,C#,JAVA)语言中不再存在全局变量。
为了在程序中应用一个全局访问点(全局变量)也就产生了单例模式,在Gof四人设计模式中对单例模式这样定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
根据定义,它有两重意思,1,一个类仅有一个实例,2,可以在全局范围内进行访问:
根据这连个点可以进行如下思考,只有一个实例,也就是在全局范围内只实例化一次,面向对象语言的一个特性就是
对象,类可以创建对象,而单例模式中只有一个实例,如何可以实现只实例化一次了???
类实例化本质就是调用构造函数,如果能够将构造函数的访问限制由public改为private的时候,外部就无法创建
类的实例,但是类的函数可以调用私有的构造函数,考虑到类的实例都没有,实例函数就更无法调用了,这个问题就
成了一个死循环的问题了,如何解决了???
实例函数无法调用,那么我们可以考虑类中的静态函数,这时静态函数不需要进行实例化,在静态函数中就可以
进行实例化了,同样静态函数每调用一次都会生成一个类实例:
{
//private constructor
private Singlton(){}
public static Singlton Instance()
{
//call private constructor;
}
}
那么在调用一次私有构造函数的时候就生成一个类的实例,那就和不用私有构造函数直接生成类实例一样了,为了保证
类仅有一个实例怎么解决这个问题了???
如果在类中添加一个静态的指向自己的引用,
private static Singlton instance;
那么在调用静态函数中对这个引用仅作一次赋值,然后每次返回这个引用,这样就可以实现单例模式了,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{
//static instance;
private static Singlton instance;
//private constructor
private Singlton(){}
//only open function for call
public static Singlton Instance()
{
//only one object;
if(instance==null)
{
instance=new Singlton();
}
return instance;
}
}
这样就可以实现了一个全局的访问点,当静态函数第一次调用的时候就产生了一个全局访问点
对单例模式的深入研究可以考虑:
1,多线程同时访问同一一个实例的同步问题
2,单例模式的扩展单例泛型
3,单例产生的全局访问点实例的回收问题
。。。。。。