总结整理遇到过已经使用过的设计模式
装饰器模式
Java IO 流

Java 的输入输出流中使用了装饰器模式,比如可以使用 BufferedInputStream 和 DataInputStream 来装饰几种基本的输入流。更多的例子可以参考 JavaSE(一) IO类层次关系和各种IO流的用法总结 - 有梦想的老王 - 博客园
多线程共享方式
管道
信号量
消息队列
socket
共享内存
TransmittableThreadLocal
阿里开源的多线程传递 ThreadLocal 项目 TransmittableThreadLocal 中通过包装 runnable 和 callable 来实现其功能。
适配器模式
Java IO 字节流与字符流
IO 流中的字符流和字节流的接口不同,它们之间可以协调工作就是基于适配器模式来做的,通过适配器,我们可以将字节流对象适配成一个字符流对象,这样我们可以直接通过字节流对象来读取或者写入字符数据。
InputStreamReader 和 OutputStreamWriter 就是两个适配器(Adapter),同时,它们两个也是字节流和字符流之间的桥梁。
InputStreamReader使用StreamDecoder(流解码器)对字节进行解码,实现字节流到字符流的转换OutputStreamWriter使用StreamEncoder(流编码器)对字符进行编码,实现字符流到字节流的转换
SLF4J 适配器
SLF4J 通过适配器模式适配了具体的日志实现(Log4j、Logback 等)
Hippo4j 动态线程池适配器
Hippo4j 通过实现 ThreadPoolAdapter 接口实现对 Dubbo、Spring Cloud、Kafka、RabbitMQ 等第三方线程池的适配。
外观模式(门面模式)
SLF4J
SLF4J 作为日志系统的外观,提供了一个简单的接口来隐藏底层的日志实现。使用者通过 SLF4J API(如 Logger 接口)记录日志,而不需要关心底层实现(Logback、Log4j 等)。
单例模式
SLF4J
SLF4J 的 LoggerFactory 是基于单例模式的,保证只有一个日志工厂示例,其是通过双重校验锁来实现的:
public final class LoggerFactory { |
工厂模式
SLF4J Logger factory
SLF4J 通过 LoggerFactory 来生产 Logger
public static Logger getLogger(String name) { |
InLong Sort Flink Connector
InLong Sort 模块中的 Flink Connector 采用了工厂模式来制造 Source 对象用于和具体的数据源对接。
观察者模式(发布-订阅模式)
Spring Event
Spring Event 事件监听机制就是基于观察者模式实现的,具体可参考解耦利器——观察者模式在spring中的实现一、什么是观察者模式观察者模式定义了一种一对多的依赖关系,让多个观察者对象同 - 掘金
建造者模式(生成器模式)
通过 Builder 类解决复杂的构造参数,通过链式的写法来构造一个 Builder 对象,调用 build 方法后生成目标对象。
OpenTelemetryAppender 构造
为 Apache InLong 项目的 Sort 模块集成 Opentelemetry 的日志上报功能时设计的OpenTelemetryAppender 类就采用了建造者模式,因为有不少属性是可选配置的,这样可以不用为每种情况都编写一个构造函数,而且代码看起来更优雅一些。
代理模式
静态代理、动态代理
模板方法模式
通过抽象类定义架构,具体实现交由子类。
AQS
Java 中通过 AQS 来实现锁。
策略模式
- 线程池拒绝策略
参考资料