编程范式主要有命令式编程和函数式编程,Java 同时支持两种范式,因此它是一门多范式编程语言。
面向对象不是编程范式,只要一门编程语言提供封装、继承、多态三个特性,那就可以说这门语言支持面向对象,这是个 has it 关系,而不是 is it。
回到正题,遵循 OOP 的规则可以提高代码的复用程度,即便如此,OOP 开发过程中也有大量高频代码,可以被总结为模式,这就是设计模式。设计模式并非 OOP 特有,函数编程也有其设计模式,这里先挖个坑。

1 创建型

封装创建对象的过程。

1.1 Singleton

单例模式,创建全局唯一的类,避免频繁创建、销毁。比如开发公共配置中心单例 RedisConnector。
Java 创建对象有4种方式:new 、克隆、序列化、反射。为了完全防守,单例模式需要重写 clone()、readResolve()、无参构造函数。

eager(饿汉)

  1. 枚举,编译后生成内部类,天然的单例。
  2. 静态变量,在类加载时就实例化。不推荐,请使用静态内部类。

    lazy(懒汉)

  3. 静态内部类,是静态变量的改进版,延迟了实例化。

  4. 双重校验锁,使用 synchronized、volatile。不推荐,DCL 就面试的时候有点价值。

    1.2 Factory

    工厂模式,解决接口选择的问题,在一个工厂类里面完成对象的创建。
  • Spring 的 BeanFactory。根据传入唯一标识来获得 Bean对象。

    1.3 Builder

    构建器模式,封装一个复杂对象的构建过程,并可以按步骤构造。

  • Lombok @Builder

    2 结构型

    使用组合改变一个类的运行时行为。

    2.1 Flyweight

    享元模式,通过共享的方式减少创建对象的数量。

  • Java 的 Integer。静态工厂方法 valueOf,-127 ~ 128 之间共享一个对象。

    2.2 Proxy

    代理模式。Proxy、Proxee 实现同一个接口,构造器都一样。Proxy 组合 Proxee。

  • Spring 的 AOP

    2.3 Adapter

    适配器模式。Adapter、Adaptee 实现同一个接口,构造器都一样。Adapter 组合新实现,而不是 Adaptee。

  • Java 的 BIO,比如 ByteArrayInputStream、FileInputStream 等处理流

    2.4 Decorator

    装饰器模式。Decorator、Decoratee 实现同一个接口,但 Decorator 的构造器要求传入一个 Decoratee。

  • Java 的 BIO

    3 行为型

    帮助对象间通信。

    3.1 Strategy

    策略模式,业务逻辑可以根据请求,动态选择策略。

  • 文件网关,规则校验有太多 if-else,在 @PostConstruct 创建一个 Map,key 是规则名,value 是校验逻辑。

    3.2 Observer

    观察者模式,被观察对象维护一个 Observer 列表,当状态改变时,遍历观察者列表,逐个通知。

  • Spring 的 ApplicationListener

  • 持续集成平台,修改项目配置后,在钩子中异步通知回调类。比如通知 CMDB 更新负责人信息。

    3.3 Chain of Responsibility

    责任链模式,使多个对象连成一条链,请求沿着这条链传递,直到有一个对象处理为止。

  • Java 的 Filter

  • 持续集成平台,发布项目前,后,在钩子中同步通知回调类。比如发布前的 Eureka 下线,发布后的 Http探针。

    参考文献

  • 克隆、序列化、反射机制破坏7种单例模式

  • Java枚举怎么保证单例
  • 用策略模式干掉 if else
  • 设计模式:如何优雅地使用责任链模式