如何使用Enum优化线程安全工厂创建的重复代码以提升可读性?
使用Enum优化线程安全的多实例工厂类
当然可以!用Enum来优化你的XWebserviceObjectFactoryCreator绝对是个绝佳选择——不仅能彻底解决代码重复问题,还能让代码的可读性、安全性直接上一个台阶,我来给你一步步拆解怎么实现:
第一步:用Enum封装实例创建逻辑
原来的工厂类里肯定充斥着大量重复的实例初始化代码(比如一堆if-else判断不同实例类型,然后重复写创建逻辑)。用Enum的话,我们可以把每个实例的专属创建逻辑直接封装到对应的枚举项里,把分散的逻辑集中起来。
举个实际的例子,假设你的工厂要创建不同的Webservice客户端实例(比如用户服务、订单服务),可以这么定义Enum:
public enum WebserviceType { USER_SERVICE { @Override protected Object createInstance() { // 这里写UserService的专属创建逻辑,比如初始化客户端、配置超时时间 return new UserWebserviceClient(); } }, ORDER_SERVICE { @Override protected Object createInstance() { // OrderService的专属创建逻辑 return new OrderWebserviceClient(); } }; // 抽象方法,每个枚举项必须实现自己的实例创建逻辑 protected abstract Object createInstance(); }
第二步:重构你的工厂类
现在把原来的XWebserviceObjectFactoryCreator改成依赖这个Enum,利用Enum天然的线程安全特性,同时消除重复代码:
public class XWebserviceObjectFactoryCreator { // 用ConcurrentHashMap做线程安全的实例缓存,避免重复创建(如果需要每次返回新实例,可以去掉这个缓存) private final Map<WebserviceType, Object> instanceCache = new ConcurrentHashMap<>(); // 获取缓存的单实例(线程安全) public Object getInstance(WebserviceType type) { // ConcurrentHashMap的computeIfAbsent方法自带线程安全保证,不用额外加锁 return instanceCache.computeIfAbsent(type, WebserviceType::createInstance); } // 如果业务需要多实例(每次调用返回新对象),直接调用Enum的创建方法即可 public Object getNewInstance(WebserviceType type) { return type.createInstance(); } }
为什么这比原来的代码好?
- 彻底消除重复代码:每个实例的创建逻辑都封装在对应的枚举项里,不用在工厂类里写一堆switch/if-else,代码瞬间清爽。
- 天然线程安全:Enum的实例是JVM在类加载阶段初始化的,完全由JVM保证线程安全,不用自己写同步代码、双重检查锁定这些容易出错的逻辑。
- 可读性拉满:一看
WebserviceType的枚举项就知道工厂支持哪些实例,每个实例的创建逻辑也集中在一起,后续维护起来超级方便。 - 扩展性极强:要新增一个Webservice实例?只需要在Enum里加一个新的枚举项,实现
createInstance方法就行,完全不用修改工厂类的代码,完美符合开闭原则。
万一Enum不适合你的场景?
如果因为某些特殊原因(比如需要动态添加实例类型)不能用Enum,那可以考虑这些替代方案:
- 策略模式:把每个实例的创建逻辑封装成独立的
CreationStrategy类,工厂类持有这些策略的集合,通过key来获取对应策略创建实例。 - 注解驱动:用自定义注解标记实例类,工厂类通过反射扫描注解来创建实例,但反射会有性能开销,线程安全也需要额外处理。
不过说实话,在你的多实例线程安全工厂场景下,Enum绝对是最优解——简洁、安全、易维护,几乎没有缺点。
内容的提问来源于stack exchange,提问作者Arefe
相关产品推荐
相关产品推荐

