编程范式主要有命令式编程和函数式编程,Java 同时支持两种范式,因此它是一门多范式编程语言。
面向对象不是编程范式,只要一门编程语言提供封装、继承、多态三个特性,那就可以说这门语言支持面向对象,这是个 has it 关系,而不是 is it。
回到正题,遵循 OOP 的规则可以提高代码的复用程度,即便如此,OOP 开发过程中也有大量高频代码,可以被总结为模式,这就是设计模式。设计模式并非 OOP 特有,函数编程也有其设计模式,这里先挖个坑。
1 创建型
1.1 Singleton
单例模式,创建全局唯一的类,避免频繁创建、销毁。比如开发公共配置中心单例 RedisConnector。
Java 创建对象有4种方式:new 、克隆、序列化、反射。为了完全防守,单例模式需要重写 clone()、readResolve()、无参构造函数。
eager(饿汉)
- 枚举,编译后生成内部类,天然的单例。
-
lazy(懒汉)
静态内部类,是静态变量的改进版,延迟了实例化。
- 双重校验锁,使用 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。
-
2.3 Adapter
适配器模式。Adapter、Adaptee 实现同一个接口,构造器都一样。Adapter 组合新实现,而不是 Adaptee。
Java 的 BIO,比如 ByteArrayInputStream、FileInputStream 等处理流
2.4 Decorator
装饰器模式。Decorator、Decoratee 实现同一个接口,但 Decorator 的构造器要求传入一个 Decoratee。
-
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探针。
参考文献
- Java枚举怎么保证单例
- 用策略模式干掉 if else
- 设计模式:如何优雅地使用责任链模式