【问题标题】:Factory, dependency injection, or something else工厂、依赖注入或其他
【发布时间】:2015-11-18 13:32:13
【问题描述】:

创建复杂对象的情况如下:

A a = new A();
B b = new B(a);
C c = new C(b);

在这种情况下我应该尝试创建某种工厂,还是使用依赖注入容器,或者某种构建器?

具体来说,我想实现以下目标:

C c = factory.createC();

【问题讨论】:

  • 看看是否可以应用继承,如果不能应用依赖注入是要走的路。
  • 您没有选择语言标签。是故意的吗?或者你的意思是一个(我猜是Java)?无论答案如何,您能否编辑您的问题以添加标签“与语言无关”或适当的标签?

标签: design-patterns language-agnostic factory-pattern


【解决方案1】:

这取决于许多因素,包括:

  • A、B 和 C 之间的相互依赖类型(例如,它是功能/方法依赖、数据依赖还是混合?)
  • 每个 A、B 和 C 的生命周期 - 单例、每个请求(如果它在 Web API 之类的上下文中)、每个分辨率或其他内容
  • 您是否可以在应用程序启动时解析依赖关系图(例如完全静态,或基于启动配置),或者解析是否依赖于仅在执行期间可用的数据输入(例如 Web API 的请求数据)

通常,对于可以在应用程序启动时解决的依赖关系,通过 IoC 容器进行依赖注入是可行的方法。

如果您在执行过程中需要数据输入,那么通常工厂是正确的方法,您可以将参数中的数据输入提供给工厂方法,工厂可以为该组输入返回正确解析的实例。请注意,理想情况下,工厂本身仍应插入 IoC 容器。

对于主要的数据依赖关系,您可能需要考虑构建器。

对于自定义生命周期、混合功能+数据依赖等其他场景,您可能需要使用更多自定义方法。虽然如果有的话,定制可能更倾向于工厂或构建器,但工厂/构建器本身可能仍然使用依赖注入和通过 IoC 容器解析。

【讨论】:

  • 感谢您的回答。好吧,这些是用于 Hadoop 框架中序列化的真实数据的包装器。这个想法是,当您想要序列化某个对象时,您会创建这种包装器,因此客户端可以通过调用此包装器的序列化方法来序列化数据。例如,你想序列化一辆汽车,所以汽车会调用车轮的序列化方法,车轮会调用轮胎的序列化等。所以我猜它是混合的?遇到这种情况该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多