Então pessoal sou novo no fórum e resolvi pedir ajuda quando a implementação dos patterns Factory e Abstract Factory.
Eu fiz um projeto bem simples só para testar, se é que isso pode ser considerado testar, o banco de dados H2. Ate ai tudo bem, mas eu resolvi usar os dois designs nesse meu pequeno teste e fiquei com duvida se fiz certo ou não, gostaria que vocês me dissessem se está correto ou não, e o que teria que ser arrumado.
Então o meu projeto tem um DAO para acesso com o banco H2, minha abstract factory seria, então, a responsavel por criar a factory dos DAOs do banco h2 e outros, no caso a Interface FabricaDAO ?
public class Fabrica {
public enum Tipo{
H2{
@Override
public FabricaDAO createFabricaDAO() {
return new H2fabrica();
}};
public abstract FabricaDAO createFabricaDAO();
};
public static FabricaDAO createFabricaDAO(Tipo tipo){
return tipo.createFabricaDAO();
}
}
A factory que ele devolve é a responsavel por criar os DAO, nesse caso ele so retornara uma fabrica para os DAOs do H2.
public class H2fabrica implements FabricaDAO {
@Override
public UsuarioDAO createUsuarioDAO() {
return new H2UsuarioDao();
}
}
A interface que ele implementa é:
public interface FabricaDAO {
public UsuarioDAO createUsuarioDAO();
}
Bem eu disse que era algo bem banal…
Ele retorna o UsuarioDAO que acessa o banco H2, a classe dele é esta:
public class H2UsuarioDao implements UsuarioDAO {
Connection connection;
@Override
public boolean salvar(Usuario usuario) throws SQLException {
//Implementação aqui...
}
@Override
public boolean deletar(Usuario usuario) throws SQLException {
//Implementação aqui...
}
@Override
public boolean deletarPorId(long id) throws SQLException {
//Implementação aqui...
}
@Override
public boolean alterar(Usuario usuario) throws SQLException {
//Implementação aqui...
}
@Override
public List<Usuario> listar() throws SQLException {
//Implementação aqui...
}
@Override
public Usuario buscarPorId(long id) throws SQLException {
//Implementação aqui...
}
@Override
public List<Usuario> buscarPorNome(String nome) throws SQLException {
//Implementação aqui...
}
}
E a interface do UsuarioDAO é esta:
public interface UsuarioDAO {
public boolean salvar(Usuario usuario) throws SQLException;
public boolean deletar(Usuario usuario) throws SQLException;
public boolean deletarPorId(long id) throws SQLException;
public boolean alterar(Usuario usuario) throws SQLException;
public List<Usuario> listar() throws SQLException;
public Usuario buscarPorId(long id) throws SQLException;
public List<Usuario> buscarPorNome(String nome) throws SQLException;
}
E apenas como exemplo para usar isso eu faria algo como
public static void main(String[] args) {
FabricaDAO fabricaDAO = Fabrica.createFabricaDAO(Tipo.H2);
UsuarioDAO usuarioDAO = fabricaDAO.createUsuarioDAO();
//Utilizar o usuarioDAO aqui...
}
Então essa implementação que eu fiz dos designs esta correta ou eu apenas fiz uma bagunça ?
Se estivar errada poderiam por favor dizer onde eu errei e como consertar.
Como eu sou novo no JAVA gostaria de pedir indicações de alguns artigos sobre o assunto para ler, caso conheçam.
PS: Desculpem por qualquer erro de grafia, eu tenho a mania de não suar acentos.