单例模式(Singleton pattern)

 
含义:
 
  • 一个实例
 
解决的问题:
  • 解决对象的耦合度
 
优点:
  • 提供了对唯一实例的受控访问
  • 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能
  • 可以根据实际情况需要,在单例模式的基础上扩展做出双例模式,多例模式;
 
缺点:
 
  • 如果实例化的对象长时间不被利用,会被系统认为是垃圾而被回收,这将导致对象状态的丢失。
 
应用场景:
 
就是这些类,在整个应用中,同一时刻,有且只能有一种状态
所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的,而且更重要的一点是,这个类如果有两个或者两个以上的实例的话,我的程序竟然会产生程序错误或者与现实相违背的逻辑错误。
 
单例模式vs静态方法:
 
  • 静态类有更好的访问效率
      如果你的singleton不提维持任何状态, 仅仅是提供全局的访问 , 这个时候就适合用静态类 , 这样速度也更快
       为什么静态方法访问效率高:
  • 单例支持延迟加载,而static class 则不支持这样的特性 , 在重量级的对象, 延迟加载就显得非常重要.
  • singleton 对于static class 主要的优点是更加面向对象 . 对于singleton你可以使用继承(Inheritance)和多态(polymorphism)来继承一个基类, 实现一个接口, 提供不同功能 的实现。例如 , Java中java.lang.Runtime ,该类就是一个singleton的, 调用getRuntime(),基于不同的JVM ,返回不同的实现对象, 针对一个一个JVM,确保只有一个Runtime对象 , 如果使用static class就不能很好的来实现这样的功能了 .
 
线程安全的单例模式:
 
  • 提前初始化
public class SingletonHungryMan {
    
    private SingletonHungryMan() {
    }

    private static SingletonHungryMan single = new SingletonHungryMan();

    public static SingletonHungryMan getInstance() {
        return single;
    }

}
  • dcl双重检查锁定+volatile (比在方法上加锁效率要高)
class Singleton2 {
    private Singleton2() {
    }

    private static volatile Singleton2 single;

    public static Singleton2 getInstance2() {
        if (single == null) {
            synchronized (Singleton2.class) {
                if (single == null) {
                    single = new Singleton2();
                }
            }
        }
        return single;
    }
}
  • 静态内部类
class Singleton3 {
        private Singleton3() {
        }

        private static class LazyHolder {
            private static final Singleton3 instance = new Singleton3();
        }

        private static Singleton3 getInstance() {
            return LazyHolder.instance;
        }
    }
posted @ 2017-12-18 15:39  情歌z  阅读(157)  评论(0编辑  收藏  举报