项目中常用的设计模式有:模板模式、策略模式、建造者模式、工厂模式、单例模式、代理模式、观察者模式、适配器模式
-
模板模式:通过继承覆写父类的某些方法的方式达到插入自定义代码片段的目的,如:JDK类加载器的双亲委派模型。
-
策略模式:调用同一个方法传入统一接口的不同实现对象,返回统一格式的结果,到达控制流程和代码复用的目的。
策略模式和模板模式的功能都是控制算法实现步骤和代码复用,且允许插入私有的功能代码片段。两者不同点是模板模式是通过继承覆写父类的某些方法的方式达到插入自定义代码片段的目的,而策略模式是通过传入同一个接口的不同实现类的方式 达到插入自定义代码片段的目的。 - 建造者模式:假设我要new 一个person对象,我用建造者模式的话是 Person.createBuilder().appendName("maple").appendAge(18).build();
- 单例模式:内部类饿汉式 或者 懒汉式 volatile 和 双重判断锁。 懒汉式 加 volatile 是为了禁止指令重排序,如果不加 volatile的话,可能其他线程判断对象已经存在但是调用时发现对象初始化不完全的情况。双重锁是较少加锁导致的性能浪费。
- 代理分为静态的代理和动态代理。动态代理分为cglib代理和jdk动态代理,其中jdk动态代理利用了反射,首先代理对象调用 invocationhandle的invoke方法 ,然后 invoke 方法 又调用了 入参method 的 invoke(对象,args)方法。 cglib 的话是通过继承覆写父类方法的方式实现增强代码的插入
- 观察者模式:Springboot 框架里面的事件监听 applicationEventPublisher.publishEvent(applicationEvent) 、@EventListener
- 适配器模式:AbstractExecutorSerive的 submit 支持 callable和runnable入参,是因为通过runnableadapter将runnable对象适配成了返回值为空的callable对象。