代码改变世界

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

2009-12-02 16:07  杨兴亚  阅读(1632)  评论(12编辑  收藏  举报

单例模式

面向过程(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,单例产生的全局访问点实例的回收问题

。。。。。。