参考教程:
Java中如何使用策略模式写出优雅的分支代码?_哔哩哔哩_bilibili
在所有的设计模式中,都需要遵循一个原则,就是开闭原则,开闭原则说的是扩展优于修改
一、工厂设计模式
1、简单工厂
根据不同的参数返回不同类的实例。简单工厂模式著纳闷定义一个类负责创建其他类。核心是一个工厂类,用来创建产品类。产品类一般拥有同一个父类。
源码中的日期
简单工厂局限性很强,每次想要加一个产品,就要修改一次工厂类,因为创建产品类是工厂类自己做的
2、工厂模式
原本的工厂类的改成接口,不创建产品,而是创建子工厂,将产品创建的工作交给子类。定义一个用于创建对象的接口,让子类决定实例化哪个类。
这样做的好处是,当新增一个产品的时候,我们不用修改原有的工厂,而是新建一个工厂,并且新建一个产品
在JDK源码中的展示是:
Collection是抽象工厂(也就是父工厂),LinkedList和ArrayList是子工厂。Iterator是产品大类,两个子工厂生产出来的产品分别是ListItr和Itr。
也就是说在工厂模式中,工厂类有自己的父子,产品类也有自己的父子
3、抽象工厂模式
相比于工厂模式,抽象工厂解决了一个问题。工厂模式的每一个父类的子类都可以生产多种产品。但是缺陷在于,每次对生产的产品进行调整的时候都要修改工厂子类,违反了开闭原则
二、模板模式
封装不变部分,扩展可变部分。定义一个操作中的算法骨架,将一些步骤延迟到子类中。模板可以使子类不改变一个算法结构即可重定义该算法的某些特定步骤。
做法:将通用的算法抽象出来。在父类(抽象类)方法的定义中,使所有的方法都抛出异常,这样,继承了抽象类但是没有实现某个方法的子类,在调用该方法的时候,会抛出异常,表示该子类没有实现该方法
三、策略模式
对扩展开放,对修改关闭。就是接口和实现类的关系,就像我们在写Service impl的时候,每次都写一个接口和一个实现类。实际上是一种策略模式。策略模式就是类爆炸(会出现一种接口和实现类),但是完美的符合了开闭原则
取代了大量的if else,在进行业务扩展的时候比较方便,不用if else打补丁。
解决同样逻辑的if else使用的是策略模式,因为在策略模式中,是使用接口和实现类。如果在if else中需要走不同的业务逻辑,就要用到模板模式了,因为模板模式中使用的是抽象类和继承,子类可以选择性的实现不同的方法,可以实现不同的功能。