Singleton 单例模式

来源:互联网 发布:刘备是汉室宗亲吗 知乎 编辑:程序博客网 时间:2024/05/01 18:50

代码实例:

package com.xxjstgb.struts;


public class Singleton
{
    // 定义一个私有的静态全局变量来保存该类的唯一实例
    private static Singleton singleton;
    
    // 构造函数必须是私有的
    // 这样在外部便无法使用 new 来创建该类的实例
    private Singleton()
    {
    }
    
    // 定义一个全局访问点
    // 设置为静态方法
    // 则在类的外部便无需实例化就可以调用该方法
    public static Singleton GetInstance()
    {
        // 这里可以保证只实例化一次
        // 即在第一次调用时实例化
        // 以后调用便不会再实例化
        if (singleton == null)
        {
            singleton = new Singleton();
        }
        return singleton;
    }
}


测试代码:

package com.xxjstgb.struts;


public class Test
{
   public static void main(String[] args)
    {
        Singleton singletonone =Singleton.GetInstance();
        Singleton singletontwo = Singleton.GetInstance();
        if (singletonone == singletontwo)
        {
            System.out.println("singletonone和singletontwo代表同一个实例!");
        }
        else
        {
            System.out.println("singletonone和singletontwo代表的不是同一个实例!");
        }
    }
    
}

测试结果为:

singletonone和singletontwo代表同一个实例!

从上面的结果可以看出来,尽管我两次访问了 GetInstance(),但是我访问的只是同一个实例,

换句话来说,上面的代码中,由于构造函数被设置为 private 了,

所以您无法再在 Singleton 类的外部使用 new 来实例化一个实例,您只能通过访问 GetInstance()来访问 Singleton 类,

GetInstance()通过如下方式保证该 Singleton 只存在一个实例:

首先这个Singleton 类会在在第一次调用 GetInstance()时创建一个实例,并将这个实例的引用封装在自身类中,

然后以后调用 GetInstance()时就会判断这个 Singleton 是否存在一个实例了,如果存在,则不会再创建实例。

而是调用以前生成的类的实例,这样下来,整个应用程序中便就只存在一个实例了。

从这里再来总结单例模式的特点:

首先,单例模式使类在程序生命周期的任何时刻都只有一个实例,

然后,单例的构造函数是私有的,外部程序如果想要访问这个单例类的话,

必须通过 GetInstance()来请求(注意是请求)得到这个单例类的实例




0 0
原创粉丝点击