Я заметил, что наличие интерфейса и объекта доступа к данным (DAO) действительно начинает складываться:
public interface ForceDAO{
public void store(Force force);
public void delete(Long forceId);
public Force findById(Long forceId);
public List<Force> findAll();
public void deleteAll();
}
У меня есть один и тот же интерфейс, реализация для каждого из моих классов сущностей. Прежде чем я сойду с ума от рефакторинга, я задаюсь вопросом, есть ли какие-либо шаблоны предложения, чтобы примениться здесь? У меня было несколько собственных идей:
Используйте шаблонный шаблон для выделения всего кода шаблона и при необходимости делегируйте его конкретным DAO. Это может уменьшить код, но я думаю, что количество файлов интерфейса и классов будет одинаковым.
Опишите интерфейс и реализацию с использованием обобщений, а затем параметризовайте реализацию с конкретным DAO, который мне нужен. Опять же, это уменьшит код, но я думаю, что количество файлов останется прежним. Кроме того, я не уверен, как это сработает, так как мои дженериковые навыки еще не сильны. Пока это мой предпочтительный выбор. Кто-нибудь еще использует подобную стратегию?
Создайте абстрактный базовый класс DAO, который реализует общую функциональность, а затем дополните его более конкретными классами DAO для деталей. Это избавило бы меня от необходимости создавать так много интерфейсов, хотя имена методов DAO не могли быть специфичными для сущности (например, я не мог использовать findDogById (), это должен был быть просто findById ()).
Наконец, поскольку при извлечении данных могут быть задействованы разные схемы доступа (Hibernate, JPA, iBatis и т. Д.), Может показаться, что обмен реализациями является желательным. Это хорошо вписывается в шаблон стратегии.
Какой самый элегантный и эффективный подход к разработке DAO? Какой подход лучше всего подходит для повторного использования и минимизирует избыточность?