如何在Java中打包工厂

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

感谢您的时间和反馈

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

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

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

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

我的建议:

  • 不要在implmentation类上添加任何包限制,因为您不知道将来使用哪些实现,或者在不同的上下文中使用。
  • 接口可以在同一个包中,但这种限制也是不必要的,只会使配置变得僵硬。
  • 当接口/实现映射没有硬编码时, 可以在项目中重用和共享可 配置工厂 (例如服务查找)。 仅此一点就certificate工厂与接口和实现类是分开的。

重用单位是发布的单位 。 这意味着不应该跨包进行耦合,因为包通常是最低的发布粒度。 当你组织一个包时,想象自己说,“这就是你使用这些类所需的一切。”

这完全取决于你打算使用这些工厂的方式。 有时将工厂放在自己的包装中是有意义的。

例如,您可以使用接口foo.bar.ui.Interface 。 你想要有不同的接口实现,一个用于AWT,一个用于Swing,一个用于控制台等。然后创建一个创建foo.bar.ui.swing.SwingInterfacefoo.bar.ui.swing.SwingInterfaceFactory更合适foo.bar.ui.swing.SwingInterface 。 然后foo.bar.ui.awt.AWTInterface的工厂将驻留在foo.bar.ui.awt.AWTInterfaceFactory

重点是,没有始终遵循这条规则。 使用适合您的问题的任何东西。

我喜欢将工厂放在它正在创建对象的包中,命名是关键,如果命名清晰透明,它将有助于维护工作。

例如,动作工厂可以构造为:

  • org.program.actions
  • interface org.program.actions.Action
  • enum org.program.actions.ActionTypes
  • factory org.program.actions.ActionFactory (或.ActionManager
  • 动作实现类org.program.actions.LogAction

在整个项目中遵循这样的模式可以帮助项目成员找到他们之前未涉及的项目中实际所在的类。

为什么不。 如果没有其他异议,尽量让它尽可能接近。 实际上为什么不

 public interface Toy { static class Factory { public static final Toy make() { ... } } } Toy toy = Toy.Factory.make(); 

哈!

但是make()不应该静态地依赖于Toy的子类,那会很糟糕。 它可以做一些动态魔术,取决于你的工厂策略。