DAO + DAOFactory + GenericDAO + Interface - Correto ou exagero?

Estou refatorando e melhorando o meu sistema e surgiu uma duvida agora. Antes eu soh usava o GenericDAO e DAO, aí vi varios exemplo usando Interface e outros usando DAOFactory, resolvi tentar fazer com todos esses padroes e funcionou, mas a dúvida é: posso fazer isso? Não tem padrao demais? Nao tem coisa redundante?
A minha estrutura ficou assim:

AlunoDAO:

//imports

public class AlunoDAO extends GenericDAO<Aluno> implements InterfaceAlunoDAO {

    public AlunoDAO(Session session, Class<?> classe) {
        super(session, classe);
    }

    public Aluno carregar(String nome) throws HibernateException {
        
    }

    public List carregarTodos() throws HibernateException {
       
    }
}

GenericDAO:

//imports

public class GenericDAO<X> {

    private Class persistentClass;
    protected Session session;
    protected Transaction transaction;
    protected SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

    public GenericDAO(Session session, Class persistentClass) {
        this.session = session;
        this.persistentClass = persistentClass;
    }

    public void Salvar(X x) throws HibernateException {
       
    }

    public void Atualizar(X x) throws HibernateException {
     
    }

    @SuppressWarnings("unchecked")
 
    }

    @SuppressWarnings("unchecked")
    public List<X> Listar() {
      
    }
}

InterfaceAlunoDAO:

public interface InterfaceAlunoDAO {

    public Aluno carregar(String nome) throws HibernateException;
    public List carregarTodos() throws HibernateException;
}

InterfaceDAOFactory:

package teste.dao;

public interface InterfaceDAOFactory {

    public InterfaceAlunoDAO criarAlunoDAO();

}

DAOFactory:

public class DAOFactory implements InterfaceDAOFactory {

    private final Session session;
    
    public DAOFactory() {
        super();
        session = HibernateUtil.getSession();
    }

    public InterfaceAlunoDAO criarAlunoDAO() {
        return new AlunoDAO(session, Aluno.class);
    }

}

Posso manter asssim ou devo retirar alguma coisa, alterar outras? O que acham?
Estava pensando em deixar apenas Interfaces + GenricDAO + DAO, mas nao enxerguei ainda como, se alguem puder me dar uma dica e uma opiniao, agradeço.

Alguem pode me ajudar? Alguma dica?

você vai precisar de interfaces e factories se tiver mais de um método de persistência para o mesmo objeto.

por exemplo, digamos que sua aplicação funcione em diferentes arquiteturas (não sei se usei a palavra certa aqui), onde em uma delas você utilize JDBC, em outra JPA e em ainda outra XML, para persistência de dados.

você teria algo como GenericDao, AlunoDao (interface), AlunoJdbcDao, AlunoJpaDao e AlunoXmlDao que extenderiam GenereicDao e implementariam AlunoDao e uma AlunoDaoFactory que decidiria qual das implementações de UsuarioDao seria instanciada.

se não for o seu caso, tudo isso é desnecessário.

Entao esse nao eh meu caso, pois soh vou usar Hibernate mesmo, nada mais. Acho que vou manter apenas o DAO normal e GenericDAO

é isso aí!

Eu acho que é exagero ter tudo isso de factories, daos etc

tu já pensou em usar Spring? Já elimina boa parte dos teus factories :slight_smile:

O Spring é uma boa dica…

Tem um tutorial básico para iniciar ele aqui:

http://www.javaframework.org/portal/2010/03/14/hello-world-com-spring-3-para-um-projeto-web/

e aqui

http://www.javaframework.org/portal/2010/03/15/spring-3-configurando-beans-com-annotations/

Leia nessa ordem…

Eu também não gosto muito de milhares de interfaces na aplicaçao… mesmo porque só existirá uma implementacao… prefiro ser mais prático nesse sentido