gpt4 book ai didi

Java 接口(interface)、创建者模式和 "getInstance()"方法或等效方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:22 24 4
gpt4 key购买 nike

我想首先说明我的问题源于 Java 中的接口(interface)不允许静态方法这一事实。在 SO(例如 here)上已经讨论过这个原因。所以我们不要详述这一点。我正在为我的接口(interface)寻找一种方法来创建它自己的实例(而不是它的实现)并返回它。尽管玩弄了单例模式、工厂模式和抽象工厂模式,但我仍然无法实现我的目标。

详细说明我正在尝试什么 - 这是我的界面:

public interface NoteDataStore {
public boolean deleteNote(long noteId);
public boolean addNote(Note note);
public List<Note> listNotes();
public boolean editNote(long noteId, Note note);
public List<Note> search(String searchString);
}

这是我的业务逻辑层:

public class BusinessLogicLayer {

public BusinessLogicLayer(){
/*
* GOAL: To get an instance of NoteDataStore here,
* without being aware of the implementation class.
*/
}

}

我试过像这样使用工厂模式:

public interface NoteDataStoreFactory {
public NoteDataStore getDataStoreInstance();
}

public class NoteDataStoreFactoryImpl implements NoteDataStoreFactory{
public NoteDataStore getDataStoreInstance(){
return NoteDataStoreImpl.getInstance();
/*
* Here, NoteDataStoreImpl is an implementation of NoteDataStore.
* This should be transparent to my business logic layer.
*/
}
}

但是,这仍然需要业务逻辑层知道实现类 NoteDataStoreFactoryImpl 因此:

NoteDataStore = new NoteDataStoreFactoryImpl().getDataStoreInstance();

我该如何解决这个问题?如何让我的 BusinessLogicLayer 对要使用的确切实现类一无所知?


编辑:我的问题的更详细背景

一些答案​​建议使用 Spring 等框架。唉,我不能这样做,因为这个应用程序针对各种移动平台(Android、Blackberry、JavaME)。我应该在我最初的问题中明确说明这一点 - 很抱歉没有这样做。

我的主要目的是开发一个跨平台的应用程序。 UI、数据库访问、HTTP 传输层等必须针对每个平台进行专门编码。但是,业务逻辑非常简单,足以保证在所有平台上都有一个通用层。我打算将业务逻辑层作为 JAR 库进行分发。解析和框架层(对于 JSON/XML)也是如此。

SO 已经对此进行了讨论(关于我是否应该走这条路)- Logic Code reuse .但是,假设这是可以的,并且我继续采用分层方法并打算在代码中使用一个通用层。现在,我的情况是:

  1. 一个通用的业务逻辑层。
  2. 特定于平台的数据层(由 NoteDataStore 接口(interface)表示)
  3. 特定于平台的应用程序核心层( Controller ,如果我可以这样称呼的话)。

请注意,如果我使用工厂模式或其他类似模式,我可以为每个平台提供特定的层。因此,工厂方法/类本身可以知道 NoteDataStore 实现类。但是,业务逻辑层必须不知道任何实现类。

各层的典型用法如下:

public class NoteDataStoreAndroid implements NoteDataStore{

public boolean deleteNote(long noteId){
/*
* Android-specific database code
*/
}

/* ... similarly, other methods */
}


public class AndroidCoreApp{

public void doBusinessLogic(){
BusinessLogicLayer businessLogic = new BusinessLogicLayer();
businessLogic.startBusinessLogic();
}
}

关于如何处理这种情况的任何输入?

最佳答案

你的类应该从外部接受工厂实例。当您自己创建实例时 - 您一无所获,这是正确的。

这里有几种技术。一般来说,它们属于非常普遍的东西,叫做Inversion of Control。或简称 IoC。了解“控制容器反转”或 IoCC 也很有用。例如 Java 有 Spring - 阅读 here .你应该向真正的 Java 专家询问其他人:)

也看看这个article .

关于Java 接口(interface)、创建者模式和 "getInstance()"方法或等效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6811782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com