天天看点

设计模式GOF23之单例模式理解

设计模式:      
      将设计者的思维融入大家的学习和工作中      
创建者模式:      
      单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式      
结构型模式:      
      适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式      
行为模式:      
      模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式。状态模式,策略模式,职责链模式,访问者模式。      
单例模式:      
      保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。      
      使用场景:Task Mangager(任务管理器)      
           回收站      
           数据库连接池      
           操作系统的文件系统      
           Application(Servelet)      
      单例模式的优点:      
           因为只生成一个实例,系统开销小,      
      五种单例模式

           主要:      
           懒汉式(线程安全,调用效率高,但是不能延时加载)      
           饿汉式(线程安全,调用效率不高。但是,可以延时加载)      
其他:      
      双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)      
      静态内部类式(线程安全,调用效率高,但是,可以延时加载)      
      枚举单例(线程安全,调用效率高,不能延时加载)      
饿汉式实现单例模式代码中,static变量会在类装载时初始化,此时也不会出现多个线程访问该对象的问题。虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题。因此我们说饿汉式天然线程安全。      
因为静态访问方法不需要同步,因此调用效率高。但是没有延时加载      
懒汉式      
     Lazy load。延迟加载,懒加载。用时加载      
     资源利用率高了,但是每次调用getInstance都需要同步,并发效率较低。      
双重检测锁实现      
     这个模式将同步内容下放到if内部,提尕了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建以后就没必要了。      
     问题:由于编译器优化原因和JVM内部模型原因,偶尔会出问题。不建议使用。      
静态内部类实现:      
     要点:      
          外部类没有static属性,则不会像饿汉式那样立即加载对象      
           只有真正调用getInstance(),才会加载静态内部类。加载类是线程安全的。instance是static final,保证了内存中只有这样一个实例存在,而且只能被赋值依次,从而保证了线程安全性。      
     兼备了并发高效调用和延迟加载的优势。      
枚举实现单例模式:      
      优点:      
           实现简单      
           枚举本身就是单例模式,由JVM从根本上提供保证,避免通过反射或者反序列化问题。      
           缺点:      
                 无延迟加载      
单例模式问题:      
      反射可以破解上面的单例模式(除了枚举)      
(可以在构造方法中抛出异常控制)      
反序列化可以破解上面集中单例模式(不包含枚举)      
     可以通过定义readResolve()防止获得不同对象      
     ----反序列化时,如果对象所在类定义了readResolve()(实际上是以中国回调),定义返回那个对象      

继续阅读