繁体   English   中英

构建器模式与依赖注入(例如通过Guice)

[英]Builder pattern vs. Dependency Injection (for instance via Guice)

我正在开发一个简单的树形结构数据库,我通常通过Builder(Builder模式)设置依赖项或可选设置。 现在我不确定何时使用Guice,何时使用Builder模式以及何时使用静态工厂方法而不是构造函数本身。 我已经多次阅读过Effective Java,我认为它至少提到了不暴露构造函数的许多优点。 是时候重读了;-)

那么,您是否知道明显可区分的案例? 我不应该暴露构造函数? 因此,例如在每种情况下写public static Foo getInstance(...) { return new Foo(...)}

我坚信你不需要为一切使用依赖注入。

  • 对于LookupService ,自然会注入一个Dictionary ,使其实现可以通过配置进行交换。

  • 另一方面,对于Firewall 它很自然地可以通过提供的FactoryBuilder创建自己的FireWallRules

作为指导,注入您需要配置的内容 ,不要自动注入其他所有内容。


考虑一个static factory (*)

  • 需要命名构造逻辑。 例如, Lists.newArrayList()
  • 建筑如此复杂,不属于班级本身
  • 不需要工厂配置,工厂没有副作用

考虑instance factories

  • 有复杂的实例化逻辑
  • 需要配置工厂
  • 使用AbstractFactory设计模式
  • 需要在整个程序生命周期中创建其他对象

考虑一个builder

  • 有复杂的参数选择。 例如,5个参数,其中一些是可选的。

(*) 静态方法并不总是可测试的,在我看来,一个人的存在总是有动力的 工厂的典型用例是减少耦合 通过使用static factory ,能力完全丧失。

构建器模式与依赖注入

这些2在您的脑海中甚至接近可比性如何?
当您需要处理构造函数具有大量参数(可能是可选的)的类时,将使用构建器模式 ,此模式使您的代码更易于读写。

依赖注入是一种有助于松散耦合的方法,可以将更高级别类的依赖性移除到更低级别的类。 例如,需要连接到数据库的类不会直接创建连接,而是“注入”连接,并且可以将此连接交换到其他数据库,而不会影响使用它的代码。

我已经开始在我的大部分项目中使用构建器,事实证明我可以用构建器和单例替换所有的DI。

即:

AppContext appContext = new AppContext.Builder()
.setProperties(testProps)
.setDB(testDB)
.build();

// run tests

没有DI,我的代码变得更加简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM