Skip to content

面试题蒸馏卡:常用设计模式及应用场景

问题:开发中用过哪些设计模式?

一句话机制

设计模式是对"变化点"的封装:把"会变的部分"从"不变的逻辑"里抽出来,用组合/继承/接口留出扩展点。回答不要背名字,要讲"在哪用、为什么用这个"。

实际用到的模式(场景 → 模式)

模式实际用到的地方
单例Spring Bean 默认单例、连接池、配置中心、Redis 客户端
工厂BeanFactorySqlSessionFactory、各种 XxxFactory
建造者 BuilderStringBuilderSqlSessionFactoryBuilderOkHttp Request.Builder、Lombok @Builder
代理 ProxySpring AOP、事务、@Transactional、MyBatis Mapper 接口、RPC 客户端桩
模板方法JdbcTemplate/RedisTemplate、Servlet doGet/doPost*Template 系列
策略 StrategyThreadPoolExecutor 拒绝策略、支付方式路由、Comparator
观察者 ObserverSpring ApplicationEvent、消息监听、Guava EventBus
责任链Servlet FilterHandlerInterceptor、Netty PipelineOkHttp Interceptor
适配器 AdapterSpring MVC HandlerAdapter、Slf4j 门面、事务 PlatformTransactionManager
装饰器 DecoratorJava IO(BufferedInputStream)、Collections.synchronizedList
门面 FacadeJdbcUtilsRestTemplate 封装、统一对外 API

追问链

  1. 单例在 Spring 里线程安全吗? 容器保证单例 bean 只创建一次;但 bean 内部若有可变状态,并发安全要自己保证(无状态组件通常安全)。
  2. 代理和装饰器结构相似,区别在哪? 代理控制访问(AOP 加事务/鉴权,原对象对调用方透明);装饰器增强功能(叠加职责,如 IO 流套 Buffer)。
  3. 策略模式和工厂模式怎么配合? 工厂负责"创建哪个策略对象",策略负责"执行算法"——常见 StrategyFactory
  4. 模板方法 vs 回调? 都是"固定流程 + 可变步骤";模板方法用继承(子类重写钩子),回调用函数对象(更轻量,如 RedisTemplate.execute)。
  5. 你项目里哪里用了责任链? Spring HandlerInterceptor、Servlet FilterGateway 的 GlobalFilter 都是责任链。

常见误解

  • ❌ "设计模式就是 GOF 23 种" —— 还有 J2EE/并发/架构模式,且不要为了用而用(过度设计比不用更糟)。
  • ❌ "单例 = 全局变量" —— 并发下要注意 double-checked locking 的 volatile 可见性。
  • ❌ "工厂模式很复杂" —— 简单工厂/工厂方法/抽象工厂按场景选,多数业务用简单工厂或 Spring 注入即可。

关联

最近更新