Объекты доступа к данным имеют тенденцию следовать той же структуре и шаблону, поэтому вы можете рассмотреть возможность создания класса более высокого уровня, инкапсулирующего эту общую логику.Я выделю на примере, пожалуйста, обратите внимание, что я опускаю интерфейсы, потому что я редко нахожу их полезными на уровне DAO.
Базовый класс DAO :
public class BaseDAO<T> {
private Class<T> clazz;
public BaseDAO(Class<T> clazz) {
super();
this.clazz = clazz;
}
public T find(Long id) { ... }
public List<T> findAll() { ... }
public T create(T entity) { ... }
public T update(T entity) { ... }
public void delete(T entity) { ... }
}
Производный DAO для гипотетического объекта Account
public class AccountDAO extends BaseDAO<Account> {
public AccountDAO() {
super(Account.class);
}
public List<Account> findByAccountStatus(String status) { ... }
}
As youвидите, вы значительно минимизируете объем кода в производных DAO.С этой настройкой вам не нужно использовать фабрику, просто инициализируйте ваши DAO напрямую.
Что касается вашего второго вопроса, я бы не стал размещать метод аутентификации в учетной записи DAO.С аутентификацией следует обращаться на более высоком уровне абстракции (очень хорошо вписывается в уровень обслуживания), даже если она в конечном итоге получает некоторую информацию из уровня доступа к данным.