3

我已经定义了一个我的系统将依赖的接口:

IMethodCall

我创建了一堆实现的类IMethodCall

AbstractMethodCall
ConstructorCall
TargetConstructorCall
VoidMethodCall
TargetVoidMethodCall
NonVoidMethodCall
TargetNonVoidMethodCall

它们是实现的细节,我的系统不知道它们(或者至少不需要知道)。

根据我当时手头的一组数据选择要实例化的实现背后有一些棘手的逻辑,所以我决定创建一个工厂,将所有逻辑分组在一个地方:

MethodCallFactory

我试图了解这里使用的包结构应该是什么。我最初的想法是将所有具体类放在一个methodCalls包中,并将它们设置为受包保护,这样就没有人知道它们的存在了。然后我让IMethodCall外面MethodCallFactory,所以我的系统的用户可以使用它们。问题是,如果我将具体类作为包保护,那么工厂也必须在它们的包中,这反过来看起来有点奇怪,因为对于外部查看者来说,它看起来像是一个只存在包含的包一个工厂。

目前我看到的最好的权衡是将具体类公开,但我想知道你们通常如何处理这种情况?

4

2 回答 2

2

当我遇到这种情况时,我会将具体的实现类和工厂放在同一个包中,并将实现类包私有化。

您提到这种方法似乎很奇怪,因为外部观点。我不同意外部用户不知道有实现类。大多数 IDE 将显示包中的类,即使它们不可访问。此外,如果程序员试图使用您的实现类,编译器将暗示该类存在但不允许访问。

我也不同意只有一个包含工厂并且它是私有实现的包是很奇怪的。这组类是紧密相关的,这使得将它们组合在一个地方是合乎逻辑的。

于 2012-05-13T15:47:07.593 回答
0

您可以将您的工厂类和接口放在公共包中,并将实现的类放在内部包中。

不鼓励使用内部包,内部包中的类可能随时更改。用户应调用公共包中的 api。

例如:

公共包是 org.feeling.ui.dialogs

一个内部包是 org.feeling.internal.ui.dailogs

于 2012-05-13T15:28:18.817 回答