【发布时间】:2021-06-08 12:10:01
【问题描述】:
假设我的接口AuthorDao 具有两个不同的实现类,例如MyAuthorDaoImpl1 和MyAuthorDaoImpl2。
在我的界面 AuthorDao 中,我有一些基本的 crud 方法和 一个额外的方法,即 static,用于获取 MyAuthorDaoImpl1 的新实例。
看起来像这样:
public interface AuthorDao {
void methodA();
void methodB();
...
static MyAuthorDaoImpl getInstance() {
return new MyAuthorDaoImpl1();
}
}
问题
- 这个静态方法
getInstance()不是反模式吗? 因为在我看来,我们不应该将我们的界面依赖于具体的 实现类,但我的朋友说没关系,他很确定,这应该是这样的。他说这是工厂方法。 - 他说我们可以通过构造函数创建这个接口的实例,我们不必使用这个
static方法,所以这没什么不好。真的吗,这没什么不好?我认为这是紧耦合的例子,接口不应该依赖于具体的实现,但他说事实并非如此。 - 他指的是这和
Calendar类中的情况一样,因为还有getInstance()方法。
编辑
另外,在他看来,如果我们决定将MyAuthorDaoImpl1 更改为MyAuthorDaoImpl2,这种静态方法将简化重构。
因为唯一的变化将在getInstance() 方法中。
【问题讨论】:
-
不,这不是工厂模式。很好,你对此提出质疑。接口的目的是成为契约。合约可以有静态方法,但我认为它们不应该生成接口实现的实例......
-
Calender类是一个抽象类。抽象类可以具有生成 x(接口)实现的方法。您正走在成为优秀开发人员的正确道路上。
-
@SusanMustafa 我认为你提到这是你的意见很好。没有什么是明确的。
List.of、Set.of等是添加到提到的Calendar实例的好例子。再补充一点,我认为只要生成的 API 不会使合约的客户端依赖于特定的实现,就可以了。 (我猜如果静态接口方法来得正是时候,Collections类就不会存在)。getInstance()方法唯一的代码异味是它不需要输入,这意味着存在“第 1 个”实现。
标签: java interface dao design-principles