【Java学习笔记】21:单实例设计模式

来源:互联网 发布:淘宝以前的订单消失了 编辑:程序博客网 时间:2024/06/01 10:50

单实例(单例):即一个类只能产生一个实例,在有些时候这样设计是必要的。

如果构造方法是public类型,那么用户可以任意地用它来构造实例,显然不能保证单例的要求。

package t1;public class test {    public static void main(String[] args) {        NotSingleton n1=new NotSingleton();        NotSingleton n2=new NotSingleton();    }}class NotSingleton{    public NotSingleton(){    //构造器    }}

所以首先要保证构造方法是私有的。
因此考虑用自己实例化自己的方式,因为还没有创建对象,所以要提供一个暴露给外部的静态方法,通过外部调用这个静态方法来创建实例。

package t1;public class test {    public static void main(String[] args) {        //尝试创建两个实例对象        NotSingleton n1=NotSingleton.GetInstance();        NotSingleton n2=NotSingleton.GetInstance();        //测试这两个对象是否相等        System.out.println(n1==n2);    }}class NotSingleton{    //构造器    private NotSingleton(){    }    //用于自己实例化自己的静态方法    public static NotSingleton GetInstance()    {        return new NotSingleton();    }}

运行的结果是false,说明这两个对象还是不同。这是因为每次调用时都new了一个新的NotSingleton对象,因此不妨在类体内创建好这个对象,每次调用静态方法时都判断一下对象是否已经存在。
因为静态的方法不能访问非静态的对象,所以这个对象也要做成静态的。

package t1;public class test {    public static void main(String[] args) {        //尝试创建两个实例对象        NotSingleton n1=NotSingleton.GetInstance();        NotSingleton n2=NotSingleton.GetInstance();        //测试这两个对象是否相等        System.out.println(n1==n2);    }}class NotSingleton{    //构造器    private NotSingleton(){    }    private static NotSingleton Instance;    //用于自己实例化自己的静态方法    public static NotSingleton GetInstance()    {        if(Instance==null)        {            Instance=new NotSingleton();        }        return Instance;    }}

运行的结果为true。上面的方式被称为懒汉模式,即先创建Instance但不实例化它,等到调用静态方法GetInstance()时再判断要不要做实例化。
与之相对的还有饿汉模式,即先做实例化,在静态方法中只要直接返回实例即可。

package t1;public class test {    public static void main(String[] args) {        //尝试创建两个实例对象        NotSingleton n1=NotSingleton.GetInstance();        NotSingleton n2=NotSingleton.GetInstance();        //测试这两个对象是否相等        System.out.println(n1==n2);    }}class NotSingleton{    //构造器    private NotSingleton(){    }    private static NotSingleton Instance=new NotSingleton();    //用于自己实例化自己的静态方法    public static NotSingleton GetInstance()    {        return Instance;    }}

运行的结果为true。

原创粉丝点击