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

来源:互联网 发布:飞龙签名设计软件 编辑:程序博客网 时间:2024/06/10 09:28
设计模式:
      将设计者的思维融入大家的学习和工作中
创建者模式:
      单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
结构型模式:
      适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
行为模式:
      模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式。状态模式,策略模式,职责链模式,访问者模式。
 
单例模式:
      保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
      使用场景:Task Mangager(任务管理器)
           回收站
           数据库连接池
           操作系统的文件系统
           ApplicationServelet
      单例模式的优点:
           因为只生成一个实例,系统开销小,
      五种单例模式           主要:
           懒汉式(线程安全,调用效率高,但是不能延时加载)
           饿汉式(线程安全,调用效率不高。但是,可以延时加载)
其他:
      双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
      静态内部类式(线程安全,调用效率高,但是,可以延时加载)
      枚举单例(线程安全,调用效率高,不能延时加载)
饿汉式实现单例模式代码中,static变量会在类装载时初始化,此时也不会出现多个线程访问该对象的问题。虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题。因此我们说饿汉式天然线程安全。
因为静态访问方法不需要同步,因此调用效率高。但是没有延时加载
懒汉式
     Lazy load。延迟加载,懒加载。用时加载
     资源利用率高了,但是每次调用getInstance都需要同步,并发效率较低。
双重检测锁实现
     这个模式将同步内容下放到if内部,提尕了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建以后就没必要了。
     问题:由于编译器优化原因和JVM内部模型原因,偶尔会出问题。不建议使用。
静态内部类实现:
     要点:
          外部类没有static属性,则不会像饿汉式那样立即加载对象
           只有真正调用getInstance(),才会加载静态内部类。加载类是线程安全的。instancestatic final,保证了内存中只有这样一个实例存在,而且只能被赋值依次,从而保证了线程安全性。
     兼备了并发高效调用和延迟加载的优势。
枚举实现单例模式:
      优点:
           实现简单
           枚举本身就是单例模式,由JVM从根本上提供保证,避免通过反射或者反序列化问题。
           缺点:
                 无延迟加载
单例模式问题:
      反射可以破解上面的单例模式(除了枚举)
(可以在构造方法中抛出异常控制)
反序列化可以破解上面集中单例模式(不包含枚举)
     可以通过定义readResolve()防止获得不同对象
     ----反序列化时,如果对象所在类定义了readResolve()(实际上是以中国回调),定义返回那个对象
                                             
0 0
原创粉丝点击