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