2024年找工作的时候(码龄两年)。有几个面试官问我有没有使用过设计模式,我说没有。然后面试挂了,我非常不服,就买了本设计模式的书进行学习。才发现在我之前开发经历中,其实已经直接或者间接地应用了不少设计模式了,只是我不知道。今天总结一下:
-
我在使用输入流和输出流的时候,把字节流转字符流就体现了适配器模式。
-
我有次调用一个接口,想添加新的功能,但又不想改变原来的接口,就在原来的接口的基础上包了一层,这就体现了装饰器模式。
-
我使用lombok里的@builder注解,就简单应用了建造者模式。
-
代码中的自定义工具类,它的构造函数私有化了,我在它里面的定义的各种静态对象就体现了单例模式。
-
三层MVC架构,controller层只负责调用service层,我把具体业务逻辑写在了service里面,那controller就可以视作一种外观模式的应用。
-
使用字符串的时,Java会把常用字符串存到常量池,这就体现了享元模式。
-
我在使用springAOP的时候,就间接的使用了代理模式。
-
我使用Mybatis时,其中的sqlsession就充当了调用方和数据库之间的中介者,就体现了中介者模式。
-
微服务中,请求发给网关,网关路由给服务a,服务a又调用服务b,服务b转给服务c,服务c相应并依次返回结果,这就可以视作调用链模式。
-
平常开发,我定义一个接口,然后创建它的不同实现类,这就体现了策略模式。
-
我常常用到的JdbcTemplate,RedisTemplate等模板就部分体现模板方法模式。 等等等。
所以只要留心观察,平时开发到处都是设计模式。
还有一些设计模式的组合,比如:我想获得对象,可以通过工厂模式。但是如果我想每次获得的对象都一样,就可以让工厂返回同一个对象,这就是工厂+单例,如果对象很多,那我还可以把这些单例对象统一放到一个池子里面(称为单例池),用的时候再从这个单例池取,这就是工厂+单例+享元模式。如果我使用动态代理增强一下这些对象,那就是工厂+单例+享元+代理模式。如果过程中再加上事件驱动(观察者模式),那么这就是常用的springIOC的大致思路了。