关于单例设计模式的细究

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于单例设计模式的细究相关的知识,希望对你有一定的参考价值。

在日常的项目开发中,常常会遇到一个类有且只有一个实例的情况,这就是典型的单例模式。

关于单例模式的设计有三种思路:

思路一:

    1.构造方法私有;

    2.声明全局的私有的静态的类的对象为null;

    3.提供公有的静态的getInstance方法,判断对象是否为空,若为空,则创建对象,否则,直接返回对象;

    public class Singleton{

      private Singleton(){}

      private static Singleton singletonObject ;

      public static synchronized Singleton getInstance(){

        return singletonObject  = singletonObject == null?new Singleton():singletonObject ;

      }

    }

    优点:类加载的时候不会加载实例对象,延迟加载,类加载速度快;

    缺点:但线程需要等待,前一个线程锁释放后下一个才能操作,如果高并发且对性能要求高的, 这种设计效果可能不理想。

思路二:

    1.构造方法私有

    2.直接实例化全局的私有的静态的类的对象

    3.提供公有的静态的getInstance方法,只有调用此方法即返回实例对象

 

    

    public class Singleton{

      private Singleton(){}

      private static Singleton singletonObject = new Singleton();

      public static Singleton getInstance(){

        return singletonObject ;

      }

    }

    

    优点:类加载的时候实例对象,获取对象速度快。线程安全,避免了多线程的同步问题,不用加线程锁;

    缺点:不具备延迟加载,类加载速度慢。此外,如果在类中还有其他静态方法或属性,调用时也会实例化对象,而这不是我们期待的

思路三:

    1.构造方法私有

    2.声明全局的私有的静态的类的对象为null

    3.提供静态的内部类,在内部类中声明类的实例对象

    4.提供公有的静态的getInstance方法,调用内部类的已实例化的对象

    

    public class Singleton{

      private Singleton(){}

      private static Singleton singletonObject;

      public static class SingletonHelper{

        private static final Singleton INSTANCE= new Singleton ();

      }

      public static Singleton getInstance(){

         singletonObject = SingletonHelper.INSTANCE

        return singletonObject ;

      }

    }

    

    优点:既达到了延迟加载的效果也线程安全,同时避免了线程同步降低性能的问题

    缺点:无

  备注:调用类的构造方法或静态成员时会classloader,在单例模式中,构造器已经私有,只有调用静态方法或属性才会classloader

以上是关于关于单例设计模式的细究的主要内容,如果未能解决你的问题,请参考以下文章

Java-----关于单例设计模式

关于单例设计模式和 c# [重复]

关于java单例模式,这篇已经讲得很清楚了,建议收藏!

关于单例模式中volatile的使用

项目整理回顾1,关于单例使用

关于Javakeywordsynchronized——单例模式的思考