1、Builder模式
应用场景:应用于属性比较多的多的情况,简化构造方法,想要几个参数的构造方法就build参数
白话创建:如果一个类要使用Builder模式,就创建一个内部类,这个内部类有几个特点,属性和外部类相同、get 方法和 set 方法为一体,返回值为 this、一个 builder 方法,功能是创建这个内部类的实例、 一个 build 方法,功能是创建一个外部类的实例,将内部类所有属性赋给外部类的所有属性
2、工厂模式
应用场景:解耦和,将创建对象的权力分离出来成一个工厂,具体实现就是spring的 IOC
白话创建:一个抽象生产者,多个具体生产者实现它,一个工厂方法,接收不同的生成信号,生产不同的产品,利用了里氏替换原则,声明返回父类,而返回到是具体子类
3、单例模式
应用场景:一个类只有一个实例,也叫单态模式,作用是提高性能,减少创建实例开销
白话创建:创建单例有几种方式,懒汉模式、饿汉模式、内部类模式、枚举创建模式,最推荐的就是枚举,因为种无论是序列化还是反射都无法破坏
4、代理模式
应用场景:通过代理对象可以实现增强,比如在执行真实对象功能之前或之后增加日志打印或事物控制,最有代表性的是mybatis,你只需要定义一个Mapper,它会自动创建一个代理实现类
白话创建:代理类持有(关联)真实类的引用,执行代理类时,同时也可以执行真实类的逻辑,有静态代理、和动态代理(jdk代理、cglib代理)
5、策略模式
应用场景:把各种可能封装成策略,减少逻辑判断,比如 if ,大量的 if 判断会导致代码难以维护,这时就可以使用此模式或卫语句
白话创建:有三种角色,抽象策略、具体策略和上下文类,一个抽象策略(通常为一个接口,如果各个子类有重复逻辑,就可以定义为一个抽象类),多个具体策略(通常为一组封装了算法的类),上下文类(封装类),持有抽象策略的引用,用时传入具体策略,也是对策略二次封装,避免高层模块直接调用策略
6、模板模式
应用场景:将有共同行为的类封装成模板,减少代码冗余,例如:泡茶或咖啡都有以下几步骤,1、烧开水 2、把(咖啡或茶)倒入杯中 3、倒入开水 4、加入调料(糖)
白话创建:一个抽象类定义两种方法,模板方法和基本方法,模板方法定义一方法的具体流程(例如:1、烧开水 2、把(咖啡或茶)倒入杯中 3、倒入开水 4、加入调料(糖)),基本方法又分为三种,具体方法(定义每个子类都存在的重复逻辑,例如:烧开水和倒入开水),抽象方法(这些逻辑要延迟到子类,例如:把(茶或咖啡)倒入杯中,因为此时你还不知道是茶还是咖啡),钩子方法(一个是一个默认的空方法,例如:加入调料(糖),像茶就不需要加糖)
7、适配器模式
应用场景:将我们不合适的接口适配成我们需要的接口,logback日志为了统一,就定义了一些适配类,表面上是logback的,实际里面使用的是别的日志框架的
白话创建:一个接口里定义一些必用的抽象方法,其实现类里关联一个需要适配的类,所有重写方法都是用适配类的方法来实现的(简单的说就是偷天换日、偷梁换柱、狸猫换太子)
8、装饰器模式
应用场景:将一个对象增加一些额外的功能,例如:你要用过滤器过滤掉一些非法字符,这时你自定义一个类,去包装这个请求对象
白话创建:装饰类于被装饰类(目标类)实现同一个接口,装饰类不但实现了这个接口,而且还关联这个接口,用时传入具体的被装饰类,然后就可以除了被装饰的方法,还可以加入自己的逻辑(例如:mybatis的cache接口,有 9 个装饰子类,1 个被装饰子类)
9、观察者模式
应用场景:也叫发布-订阅模式,一个对象的状态改变要通知其他对象时,例如:MQ,只要消费者订阅了MQ,生产者发送每一条消息时,都会通知消费者
白话创建:定义一个接口(手机接口,里面有一个接电话的方法),每个观察者实现这个接口,被观察者定义一个观察者的集合(手机集合,哪个有手机才能打电话),和一个添加观察者(手机)的方法,一旦被观察者有状态改变,就遍历所有的观察者(手机),调用它们的通知方法(接电话方法)去通知它们
10、状态模式
应用场景:和策略模式差不多
白话创建:状态模式类似于策略模式,不同的时策略模式是用户自己传入策略到上下文中,然后根据传入的策略执行策略方法,用户使用时必须提前知道所有策略,用户权力过大,如果传入不存在的策略,就无法执行,而状态模式是用户只能选择状态类下的方法来生成不同的策略,限制了用户的行为,就像静态常量和枚举类的区别