工厂模式的正确使用探讨:该示例是否合规?有无更适配的设计模式?
1. 这是不是工厂模式的正确用法?
是,而且是**简单工厂模式(Simple Factory)**的合理实现。
工厂模式的核心目标是封装对象的创建逻辑,将对象的创建与使用解耦。你的MySimpleObjectFactory完全符合这个核心:
- 专门负责
SimpleObject的实例化,客户端不需要知道PropA是如何通过SomeTransformer转换而来的,也不需要直接调用SimpleObject.builder(); - 通过重载方法提供了多种创建
SimpleObject的入口,适配不同的输入参数场景; - 依赖注入
SomeTransformer,保证了工厂类的灵活性和可测试性,符合依赖倒置原则。
虽然它没有教科书里抽象工厂/工厂方法那种“抽象接口+子类实现”的结构,但简单工厂本身就是工厂模式家族的一员,这种写法在实际项目中非常常见,完全属于技术层面的正确用法。
2. 是否有更适配的设计模式?
目前你的场景用简单工厂已经足够,但如果后续有扩展需求(比如新增不同的SimpleObject创建逻辑、替换转换规则等),可以考虑以下模式:
工厂方法模式(Factory Method)
如果未来需要多种SimpleObject的创建策略(比如不同业务场景下用不同的Transformer或者属性构建规则),可以把MySimpleObjectFactory抽象成一个接口:
public interface SimpleObjectFactory { SimpleObject getSimpleObject(SomeObject someObject); SimpleObject getSimpleObject(SomeObject someObject, AnotherObject anotherObject); // 其他重载方法 }
然后针对不同的业务场景实现这个接口,比如OrderSimpleObjectFactory、UserSimpleObjectFactory,每个实现类使用对应的Transformer或创建逻辑。这种方式能更好地应对扩展,符合开闭原则。
建造者模式的增强结合
你已经在使用SimpleObject.builder(),如果后续SimpleObject的属性越来越多,或者需要更复杂的属性组合逻辑,可以把转换逻辑整合到建造者中,比如扩展SimpleObjectBuilder,让它直接接收SomeObject等参数并完成转换,这样工厂类的职责可以更单一,或者甚至可以替代工厂类。不过当前场景下,现有工厂的写法已经足够清晰,没必要强行替换。
依赖注入框架的Bean定义
如果你的项目使用Spring等DI框架,也可以把SimpleObject的创建逻辑写成@Bean方法,直接注入SomeTransformer,通过不同的方法参数生成实例,这本质上是利用框架实现了工厂的功能,减少手动编写工厂类的代码。
内容的提问来源于stack exchange,提问作者user19320502

