如何在 Java 中打包工厂

2022-09-02 20:21:20

我想知道如何打包我在应用程序中拥有的工厂。工厂应该与使用它的类位于同一包中,与它创建的对象位于同一包中,还是位于其自己的包中?

感谢您的时间和反馈


答案 1

通常,工厂与它们创建的对象位于同一包中;毕竟他们的目的是创建这些对象。通常它们不在单独的包中(没有理由)。此外,让工厂与他们创建的对象位于同一包中,可以利用包可见性。


答案 2

工厂的全部意义在于拥有一种可配置的方式来为接口创建实现实例。将工厂与它提供的实现类放在同一包中的约定增加了一个完全不必要的限制,您将来不太可能满足。此外,如果返回的实现在所有上下文中都不相同,则将其放在同一包中就更没有意义了。

例如,假设在应用程序的客户端和服务器部分之间共享一个服务查找工厂,该工厂在客户端上返回客户端实现(驻留在客户端包中),并在从服务器的运行时内调用时返回服务器端实现(在仅服务器包中)。

您的工厂甚至可以是可配置的(我们通过一个XML文件来做到这一点,该文件定义了要为哪个接口返回哪个实现类),因此可以轻松切换实现类,或者可以将不同的映射用于不同的上下文。例如,当单元测试时,我们使用一种配置,该配置返回接口的模型实现(确实能够执行不是集成测试单元测试),并且要求这些模型实现与工厂位于同一包中是没有意义的,因为它们是测试代码的一部分,而不是运行时代码。

我的建议:

  • 不要在 implation 类上添加任何包限制,因为您不知道将来或在不同的上下文中使用哪些实现。
  • 接口可能位于同一封装中,但这种限制也是不必要的,只会使配置变得僵化。
  • 当接口/实现映射未硬编码时,可配置的工厂(如服务查找)可以在项目之间重用和共享。仅这一点就证明了将工厂与接口和实现类分开是合理的。

推荐