我正在开发一个简单的树结构数据库,我通常通过构建器(构建器模式)设置依赖项或可选设置。现在我不确定何时使用 Guice,何时使用 Builder 模式以及何时使用静态工厂方法而不是构造函数本身。我读过 Effective Java 好几遍,我认为它至少提到了很多不公开构造函数的优点。是时候重读 ;-)
那么,您知道哪些案例可以清楚地区分吗?我不应该公开构造函数吗?因此,例如在每种情况下都写 public static Foo getInstance(...) { return new Foo(...)}
?
最佳答案
我坚信您不需要为所有 使用依赖注入(inject)。
对于
LookupService
来说,注入(inject)Dictionary
是很自然的,这样它的实现就可以通过配置换出。另一方面,对于
防火墙
。它很自然地创建自己的FireWallRules
,也许通过提供的Factory
或Builder
。
作为准则,注入(inject)您需要配置的内容,不要自动注入(inject)其他所有内容。
考虑静态工厂 (*)
- 需要命名构造逻辑。例如,
Lists.newArrayList()
- 结构太复杂了,不属于类本身
- 不需要工厂配置,工厂没有副作用
考虑实例工厂
时
- 存在复杂的实例化逻辑
- 需要配置工厂
- 使用
AbstractFactory
设计模式 - 需要在整个程序生命周期中创建额外的对象
当
- 有复杂的参数选择。例如,5 个参数,其中一些是可选的。
(*)
静态方法并不总是可测试的,在我看来,静态方法的存在应该始终是有动机的。
工厂的典型用例是减少耦合。通过使用静态工厂
,这种能力就完全丧失了。
关于java - 构建器模式与依赖注入(inject)(例如通过 Guice),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520678/