Java-интерфейсы, шаблоны создателя и метод getInstance () или аналогичный

Я хотел бы начать с упоминания, что моя проблема проистекает из того факта, что интерфейсы в Java не допускают статических методов. О причине это на SO ( здесь , например). Так что давайте не будем останавливаться на этом. Я ищу способ для моего интерфейса создать экземпляр самого себя (скорее, его реализацию) и вернуть его. я поигрался с паттерном Singleton, Factory и AbstractFactory, я все еще не могу достичь своей цели.

Чтобы уточнить, что я пытаюсь, вот мой интерфейс:

public interface NoteDataStore {
    public boolean deleteNote(long noteId);
    public boolean addNote(Note note);
    public List listNotes();
    public boolean editNote(long noteId, Note note);
    public List 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 в темноте относительно того, какой именно класс реализации использовать?


ED ИТ: Более подробная информация о моей проблеме

Некоторые ответы предполагают использование таких фреймворков, как Spring. Увы, я не могу этого сделать, потому что это приложение предназначено для различных мобильных платформ (Android, Blackberry, JavaME). Я должен был прояснить это в своем первоначальном вопросе - извиняюсь за то, что не сделал этого.

Мое главное намерение - создать приложение для разных платформ. Пользовательский интерфейс, доступ к базе данных, транспортные уровни HTTP и т. Д. Должны быть написаны специально для каждой платформы. Однако бизнес-логика достаточно проста, чтобы гарантировать общий уровень для всех платформ. Я намерен распространить уровень бизнес-логики в виде библиотеки JAR. Так же, как уровень синтаксического анализа и кадрирования (для JSON / XML).

На SO уже было обсуждение (о том, должен ли я вообще идти по этому пути) - Повторное использование логического кода . Однако при условии, что это нормально и что я придерживаюсь многоуровневого подхода и намерения иметь один общий слой в коде. Теперь моя ситуация такова, что у меня есть:

  1. Общий уровень бизнес-логики.
  2. Специфичный для платформы уровень данных (представленный интерфейсом NoteDataStore )
  3. Зависящий от платформы уровень ядра приложения ( Контроллер, если можно так назвать).

Обратите внимание, что если я использую шаблон Factory или другой подобный,Я могу позволить себе иметь этот уровень, специфичный для каждой платформы. Итак, фабричный метод / класс сам может знать о классе реализации 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();
    }
}

Какие-либо данные о том, как справиться с этим сценарием?

5
задан Community 23 May 2017 в 11:53
поделиться