简单工厂模式:
1、创建一个普通类,通过if判断以及反射,判断传入参数类型,返回创建对象,Calendar应用了简单工厂模式
工厂方法模式:
1、创建一个接口或抽象类,通过子类实现方法返回创建对象。若应用层(Controller)代码不依赖于产品实例如何被创建、实现细节,则可以应用工厂模式。Collection应用了工厂方法模式,iterator()就是工厂方法
抽象工厂模式:
1、抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,强调一系列相关的产品对象(属于同一产品族)。sql包下的Connection、Statement和mabatis的SqlSessionFactory都应用了抽象工厂模式
2、产品等级结构和产品族的关系:
3、如果说工厂方法模式针对的是产品等级结构,那么抽象工厂模式针对的就是产品族
观察者模式:
1、观察者模式字如其意,可以让多个观察者监听一个指定的对象,当该对象发生改变时,它的所有观察者都会收到通知并更新。(关联行为场景,建立一套触发机制)
2、观察者要实现Observer接口、被观察者要继承Observable类
单例模式:
1、懒汉单例(调用方法时)和饿汉单例(类加载时)的单例对象初始化时机不同
1、最简单的单例懒汉模式,在多线程访问时可能出现各种问题,比如并发安全问题(线程0进入了判空if,但还没来得及创建对象,线程1页进入了判空if,此时就会创建2个不同对象,违背了单例模式)、对象创建时的指令重排问题(创建对象在底层实际是有3个步骤,可能在设置对象指向空间和初始化对象之间发生指令重排)
2、单例模式的并发安全问题,可通过加锁解决;单例模式的指令重排问题使用volatile修饰单例对象或使用静态内部类构造单例模式解决
3、单例模式可能被序列化、反序列化(底层也是通过反射创建了新对象—)和反射破坏(通过反射的setAccessible(true)可以将构造器私有权限放开,这样就破坏了私有性,从而可以创建对象)
4、可以通过在单例类内写一个readResolve()方法返回创建的单例对象,解决被序列化破坏的问题(序列化类内底层源码有相关判断);可以通过在私有构造器内加一些防御反射的判断逻辑,解决反射破坏的问题
5、使用枚举类完成单例模式,可以有效避免序列化破坏(枚举中name唯一,所以拿到的一定是1个对象)和反射破坏(枚举类的构造器比较特殊,可以有效防止反射破坏)