[英]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
。 它很自然地可以通过提供的Factory
或Builder
创建自己的FireWallRules
。
作为指导,注入您需要配置的内容 ,不要自动注入其他所有内容。
考虑一个static factory (*)
Lists.newArrayList()
考虑instance factories
AbstractFactory
设计模式 考虑一个builder
(*)
静态方法并不总是可测试的,在我看来,一个人的存在总是有动力的 。 工厂的典型用例是减少耦合 。 通过使用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.