您的位置:首页 > 其它

设计模式之个人理解--单例模式

2009-12-02 16:07 295 查看
单例模式

面向过程(C)语言中可以在程序中应用全局变量,而面向对象(C++,C#,JAVA)语言中不再存在全局变量。

为了在程序中应用一个全局访问点(全局变量)也就产生了单例模式,在Gof四人设计模式中对单例模式这样定义

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

根据定义,它有两重意思,1,一个类仅有一个实例,2,可以在全局范围内进行访问:

根据这连个点可以进行如下思考,只有一个实例,也就是在全局范围内只实例化一次,面向对象语言的一个特性就是

对象,类可以创建对象,而单例模式中只有一个实例,如何可以实现只实例化一次了???

  类实例化本质就是调用构造函数,如果能够将构造函数的访问限制由public改为private的时候,外部就无法创建

类的实例,但是类的函数可以调用私有的构造函数,考虑到类的实例都没有,实例函数就更无法调用了,这个问题就

成了一个死循环的问题了,如何解决了???

  实例函数无法调用,那么我们可以考虑类中的静态函数,这时静态函数不需要进行实例化,在静态函数中就可以

进行实例化了,同样静态函数每调用一次都会生成一个类实例:

public class Singlton
{
//private constructor
private Singlton(){}
public static Singlton Instance()
{
//call private constructor;
}
}

那么在调用一次私有构造函数的时候就生成一个类的实例,那就和不用私有构造函数直接生成类实例一样了,为了保证

类仅有一个实例怎么解决这个问题了???

  如果在类中添加一个静态的指向自己的引用,

private static Singlton instance;

那么在调用静态函数中对这个引用仅作一次赋值,然后每次返回这个引用,这样就可以实现单例模式了,代码如下:

代码

public class Singlton
{
//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,单例产生的全局访问点实例的回收问题

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