设计模式学习01―单例模式(二)
2014-11-23 21:39:00
·
作者:
·
浏览: 29
;
private Singleton05() {
}
public static Singleton05 getInstance() {
if ( instance == null ) {
synchronized (Singleton05.class) {
if ( instance == null ) {
instance = new Singleton05();
}
}
}
return instance ;
}
}第六种(枚举)
//枚举方式(推荐),Effective Java作者Joshua Bloch推荐的方式
//优点:不仅能避免线程同步问题,还能防止反序列化生成新的对象,相当严谨
//最主要的是非常的简单
//缺点:枚举是jdk1.5之后加入的特性,对版本有要求
public enum Singleton06 {
instance;
public void someMethod() {
// 业务逻辑方法
}
}第七种(静态内部类)
//静态内部类
//优点:解决线程安全问题,而且可以延迟加载,基本上是曾经最好的办法
//缺点:代码复杂
public class Singleton07 {
private static class RealSingleton {
static final Singleton07 instance = new Singleton07();
}
public static Singleton07 getInstance() {
return RealSingleton.instance;
}
}
单例模式创建方法有很多种,没有最好的,只有最合适的,比如第七种方法比较好,但是没必要为了一个不会出现的问题而使用很复杂的第七种模式,如果没有需要延迟加载的地方(如读取配置文件等),推荐第一种模式,如果是JDK1.5以上,推荐使用枚举的方法。 单例模式还有个地方要注意,只有1个实例,虽然构造函数私有化,外边不能new了,但是还有其他方式创建对象实例,如反序列化时,可能得到另一个实例,此时就要考虑序列化对单例的影响,还有不同类加载器(ClassLoader)对单例的影响等都要考虑。 其实就是创建方式要支持的级别,这就需要根据实际情况,选择你的创建方式了: 1、每次从getInstance()都能返回一个且唯一的一个对象。 2、希望这个方法能适应多线程并发访问。 3、并发时方法性能尽可能高。 4、实现延迟加载(Lazy Load),在需要的时候才被构造,而且要能够处理业务逻辑。
5、能够处理多ClassLoader、多JVM,防止反序列化等情况。