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 类中出现悬浮引用