设计模式学习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,防止反序列化等情况。