我想知道如何在我的应用程序中打包我的工厂。工厂应该与使用它的类在同一个包中,与它创建的对象在同一个包中还是在它自己的包中?
感谢您的时间和反馈
答案 0 :(得分:21)
通常工厂与他们创建的对象在同一个包中;毕竟他们的目的是创造那些对象。通常它们不在一个单独的包中(没有理由)。使工厂与他们创建的对象位于同一个包中,这样您就可以利用包的可见性。
答案 1 :(得分:5)
Factory的重点是使用可配置方式为接口创建实现实例。将工厂与其提供的实现类放在同一个包中的约定增加了一个完全不必要的限制,您将来不太可能遇到。同样如果返回的实现在所有上下文中都不相同,那么将它放在同一个包中就更没意义了。
例如,假设一个服务查找工厂在应用程序的客户端和服务器部分之间共享,它返回客户端上的客户端实现(它位于仅客户端的包中) ,从服务器的运行时调用服务器端实现(在仅服务器包中)。
您的工厂甚至可以配置(我们通过使用XML文件来定义要为哪个接口返回哪个实现类),因此可以轻松切换实现类,或者可以将不同的映射用于不同的上下文。 例如,在单元测试时,我们使用一个配置来返回接口的模型实现(能够进行单元测试不是集成测试),它会使完全没有意义要求那些模型实现与工厂在同一个包中,因为它们是测试代码的一部分而不是运行时代码。
我的建议:
答案 2 :(得分:3)
unit of reuse is the unit of release。这意味着不应该跨包耦合,因为包通常是最低的发布粒度。当你组织一个包时,想象自己说,“这就是你使用这些类所需的一切。”
答案 3 :(得分:0)
我喜欢把工厂放在它正在创建对象的包中,命名是关键,如果命名清晰透明,它将有助于维护工作。
例如,动作工厂的结构可以是:
org.program.actions
org.program.actions.Action
org.program.actions.ActionTypes
org.program.actions.ActionFactory
(或.ActionManager
)org.program.actions.LogAction
等在整个项目中遵循这样的模式可以帮助项目成员找到他们之前未涉及的项目中实际所在的课程。
答案 4 :(得分:0)
这完全取决于你打算使用这些工厂的方式。有时将工厂放在自己的包装中是有意义的。
例如,您可以拥有一个界面foo.bar.ui.Interface
。您希望具有该接口的不同实现,一个用于AWT,一个用于Swing,一个用于控制台等。然后,创建foo.bar.ui.swing.SwingInterfaceFactory
创建foo.bar.ui.swing.SwingInterface
更合适。 foo.bar.ui.awt.AWTInterface
的工厂将位于foo.bar.ui.awt.AWTInterfaceFactory
。
重点是,没有始终遵循这条规则。使用适合您的问题的任何东西。
答案 5 :(得分:0)
为什么不呢。如果没有其他异议,尽量让它尽可能接近。实际上为什么不
public interface Toy
{
static class Factory
{
public static final Toy make() { ... }
}
}
Toy toy = Toy.Factory.make();
HA!
但是make()不应该静态地依赖于Toy的子类,那会很糟糕。它可以做一些动态魔术,取决于你的工厂策略。