接手老项目,类名叫 OrderFactory,注释里写着「双检锁」,新人容易发懵。其实 java设计模式 不是面试八股那么玄,日常业务里高频出现的就是少数几个,先吃透再谈别的。
单例:写最熟也最容易写错
配置类、连接池、全局工具类,这类只需要一份实例的对象用单例。写坏了轻则重复初始化,重则多线程下拿到两个实例。面试常考的双重检查锁,标准写法长这样:
public class ConfigHolder { private static volatile ConfigHolder instance; private ConfigHolder() {} public static ConfigHolder getInstance() { if (instance == null) { synchronized (ConfigHolder.class) { if (instance == null) { instance = new ConfigHolder(); } } } return instance; } }两个 if 加 volatile 缺一不可,少一个在多线程下都可能出问题。工程里更省事的写法是枚举单例,天然防反射攻击和反序列化破坏,一行搞定。
工厂和策略:业务代码里的常客
下单流程按支付方式走不同分支,满屏 if-else 换成策略模式,每种支付方式一个实现类,新增渠道不动老代码。工厂模式把对象创建收口,Spring 的 BeanFactory 就是这个思路的放大版。这两个模式用熟,代码评审能少挨一半骂。
别为了模式而模式
GoF 那 23 种是工具箱,不是任务清单。两个分支能解决的事,硬上策略模式属于过度设计。Spring 框架本身就是现成教材:Bean 默认单例注册,JdbcTemplate 是模板方法,事件监听是观察者,读它的源码比背 UML 图有效得多。java设计模式学到什么程度够用?看到一个需求能自然想到合适的结构、还能说清为什么,就够了。