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