关于设计模式总结的比较好的一篇文章,浅显易懂便于理解:
https://javadoop.com/post/design-pattern
一、创建型设计模式
1. 工厂设计模式
为什么,什么时候用工厂模式:调用方要创建一个类,但是对于不同情况要创建不同的类,具体的类不确定(如对于不同的语言,需要创建不同的解析器)。这时候与其在调用方进行相应的逻辑判断决定去创建哪个类,不如定义一个工厂类,由工厂类来决定怎么创建,使调用方的代码简洁明了。
- 简单工厂:通过传入静态方法的参数决定创建哪种类,对于大部分情况简单工厂已经足够
- 工厂方法:如果情况比较复杂,对于不同类型的类还要根据具体情况决定要创建哪种具体的类,可以使用工厂方法;先创建该类型的工厂,再根据参数决定去创建哪种具体的类
- 抽象工厂:如果要创建某一系列的产品,那么抽象工厂是最好的选择。
2. 建造者模式
优雅的链式创建一个类,可以使用建造者模式。(如创建一个请求,要赋值很多参数)最简洁的方式是使用 lombok 的
二、结构型模式
1. 代理模式和装饰器模式
当需要对一个类进行增强的时候,可以考虑使用代理模式和装饰器模式
- 代理模式:可以对类进行简单的增强。不过感觉静态代理使用的较少,如SpringAOP会采用动态代理的方式。
- 装饰器模式:相比于代理模式更加灵活,可以通过不断嵌套的方式来对类进行反复的增强,最典型的是IO流。
2. 桥梁模式、策略模式和模板方法模式
当一个类进行某些行为,该行为的整体流程是可知的,但是具体的执行方式需要根据不同情形决定,这时候可以采用桥梁模式、策略模式或模板方法。(如JDBC,JDBC API可以针对任何数据库引擎发出查询指令,具体的底层实现交由不同的JDBC驱动器去实现)
- 桥梁模式和策略模式非常相似,只是桥梁模式在调用类再加了一层抽象而已。桥梁模式的耦合更低,结构更复杂一些。
- 模板方法模式则更简单,直接省去策略这一层抽象,具体怎么实现直接交给子类。但是模板方法定义的范围太广,需要直接创建一个子类,只依赖某一组件时不太适用。(能用聚合尽量不用继承)
3. 享元模式
- 享元模式:本质就是复用已经生成的对象,可以理解为一种缓存,避免多余的查询和内存的浪费。(典型的是数据库连接池)
三、行为型模式
1. 观察者模式
本质就是事件发布和消息订阅,当一个事件发生需要通知其他各个组件时,可以采用观察者模式。
在生产实际中,消息队列的使用其实就是一种典型的观察者模式。
2. 责任链模式
当涉及到一个个流程步骤,且需要流程间的灵活组合的时候,可以采用责任链模式
3. 状态模式
当一个类涉及的状态操作很多,可以直接将这些状态抽象出来,减少这个类的复杂性。当需要对这个类的状态进行操作上,直接通过具体的状态类进行操作,而不是关注被操作的类。