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

标签 java design-patterns abstract-factory

我想首先说明我的问题源于 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/

相关文章:

c# - 工厂方法模式和抽象工厂模式

java - 具有继承类的抽象工厂模式

java - Java.io.FileNotFoundException:类路径资源[../ProductDao.class]无法打开,因为它不存在

java - Java中如何获取字符的精确边界框

c++ - 建议一个最合适的设计模式

css - 如何找到图案背景?

design-patterns - 策略设计模式和抽象工厂模式有什么区别?

java - foo.split (',' ).length != 在 ',' 中找到的 'foo' 的数量?

java - Libgdx & RoboVM 到应用商店

java - 模板设计模式的 Spring 配置问题