Я хотел бы начать с упоминания, что моя проблема проистекает из того факта, что интерфейсы в 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 в темноте относительно того, какой именно класс реализации использовать?
Некоторые ответы предполагают использование таких фреймворков, как Spring. Увы, я не могу этого сделать, потому что это приложение предназначено для различных мобильных платформ (Android, Blackberry, JavaME). Я должен был прояснить это в своем первоначальном вопросе - извиняюсь за то, что не сделал этого.
Мое главное намерение - создать приложение для разных платформ. Пользовательский интерфейс, доступ к базе данных, транспортные уровни HTTP и т. Д. Должны быть написаны специально для каждой платформы. Однако бизнес-логика достаточно проста, чтобы гарантировать общий уровень для всех платформ. Я намерен распространить уровень бизнес-логики в виде библиотеки JAR. Так же, как уровень синтаксического анализа и кадрирования (для JSON / XML).
На SO уже было обсуждение (о том, должен ли я вообще идти по этому пути) - Повторное использование логического кода . Однако при условии, что это нормально и что я придерживаюсь многоуровневого подхода и намерения иметь один общий слой в коде. Теперь моя ситуация такова, что у меня есть:
NoteDataStore
) Обратите внимание, что если я использую шаблон 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();
}
}
Какие-либо данные о том, как справиться с этим сценарием?