如何在Java中打包工厂

Aly*_*Aly 14 java packaging design-patterns factory

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

感谢您的时间和反馈

Fra*_* IV 23

通常工厂与他们创建的对象在同一个包中; 毕竟他们的目的是创造那些对象.通常它们不在一个单独的包中(没有理由).使工厂与他们创建的对象位于同一个包中,这样您就可以利用包的可见性.

  • 详细说明,通过*exploit package visibility*,我认为你的意思是工厂创建的实例的具体类型可以是包范围的 - 不是公开可见的 - 然后工厂是创建符合类型的唯一公共方法到一些界面.即使是更严格的锁定,也可以通过使用*package-private*constructors将工厂创建的类型定义为抽象类来实现.然后,可以仅在包含的包中定义子类.http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html (5认同)

Pet*_*ser 5

Factory的全部重点是具有一种可配置的方式来创建接口的实现实例。将工厂与提供的实现类放在同一包中的约定增加了完全不必要的限制,您将来不太可能遇到这种限制。同样,如果返回的实现在所有上下文中都不相同,那么将其包含在同一包中就没有意义了。

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

您的工厂甚至可以是可配置的(我们通过具有一个XML文件来定义该接口返回哪个实现类来实现此目的),因此可以轻松切换实现类,或者可以将不同的映射用于不同的上下文。例如,当进行单元测试时,我们使用一种配置,该配置返回接口的模型实现(可以进行非集成测试的单元测试),并且要求这些模型实现都处于同一状态根本没有任何意义。打包为工厂,因为它们是测试代码而不是运行时代码的一部分。

我的建议:

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