Java单例设计模式详解

来源:互联网 发布:国税网络发票查询系统 编辑:程序博客网 时间:2024/05/17 01:35
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
  单例模式有一下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。

  3、单例类必须给所有其他对象提供这一实例。

优点:

实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例
灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

案例:
private static Single mSinger = null;    private Single(){};    /** 懒汉式单例(线程不安全) */    public static Single getInstances(){        if (mSinger == null){            mSinger = new Single();        }        return mSinger;    }    /** 懒汉式单例(线程安全) */    public static synchronized Single getInstancesUp(){        if (mSinger == null){            mSinger = new Single();        }        return mSinger;    }    /** 双重检查锁定 */    public static Single getInstancesUp1(){        if (mSinger == null){            synchronized(Single.class){                if(mSinger == null){//二次检查                    mSinger = new Single();                }            }        }        return mSinger;    }

private static final Single single = new Single();    //静态内部类,解决反复判断问题,既实现了线程安全,又避免了同步带来的性能影响    private static class ClazzHolder{        private static final Single INSTANCE = new Single();    }    public static Single getInstancesUp2() {        return ClazzHolder.INSTANCE;    }    //饿汉式,解决反复判断问题    //类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生就是线程安全的    public static Single getInstancesUp3(){        return single;    }


缺点:

开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。
可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除
对象实例,但这样会导致 Singleton 类中出现悬浮引用




0 0
原创粉丝点击