Olá
Aproveitando o embalo, estava procurando na internet algo sobre Factory Method e Abstract Method aplicados com DAOs, e encontrei esse artigo:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
Porém, para a fábrica abstrata eles utilizam uma classe abstrata (que inclusive pode ser substituída por um interface), eu não queria ficar utilizando herança e pensei por trocar a classe abstrata por uma interface.
Como meu sistema é simples, não envolve muitos cadastros, tabelas etc, encontrei duas formas de implementação desses patterns com DAO.
Vou postar o código e me digam se este jeito de fazer é “feio” ou não :roll:
Fábrica abstrata (DAOFactory):
[code]package Model.DAO;
/**
*
-
@author Leandro
*/
public interface DAOFactory {
public BairroDAO createBairroDAO();
public CategoriaCursoDAO createCategoriaCursoDAO();
//… Demais assinaturas de métodos etc…
}[/code]
Agora a fábrica concreta para DAOs utilizando persistência com JDBC (JDBCDAOFactory):
[code]package Model.DAO;
/**
*
-
@author Leandro
*/
public class JDBCDAOFactory implements DAOFactory {
@Override
public BairroDAO createBairroDAO() {
return new JDBCBairroDAO();
}
@Override
public CategoriaCursoDAO createCategoriaCursoDAO() {
return new JDBCCategoriaCursoDAO();
}
}[/code]
Um seletor de fábricas (um exemplo), caso se queira trabalhar com mais de um tipo de persistência (Como XML, Hibernate, etc…) (FactorySelector):
[code]package Model.DAO;
/**
*
-
@author Leandro
/
public final class FactorySelector {
public enum Implementacao {
JDBC,
XML,
HIBERNATE;
}
/*
- Método para escolha da fábrica concreta.
-
@param impl Tipo de persistência a ser utilizada.
-
@return A fábrica concreta para criação dos objetos de persistência.
*/
public static DAOFactory createDAOFactory(Implementacao impl) {
switch(impl) {
case JDBC:
//Existe implementação para persistência utilizando JDBC:
return new JDBCDAOFactory();
case XML:
//Não existe implementação de persistência com XML no momento.
throw new UnsupportedOperationException(“Não há implementação para persistência com XML.”);
case HIBERNATE:
//Não existe implementação de persistência utilizando Hibernate no momento.
throw new UnsupportedOperationException(“Não há implementação para persistência com Hibernate.”);
default:
throw new IllegalArgumentException(“Tipo de persistência desconhecida ou não suportada.”);
}
}
}[/code]
Implementei desse modo tendo como modelo as práticas desse outro artigo em que a classe abstrata foi substituída por uma inteface:
http://www.javapractices.com/topic/TopicAction.do?Id=128
É a única diferença entre os dois artigos praticamente, além de algumas implementações extras.
Porém, não sei se estou errado, ou criando um anti-pattern, mas achei essa questão de criar uma DAOFactory e depois uma JDBCDAOFactory, XMLDAOFactory, ou HibernateDAOFactory, meio que reduntante, então coloquei as decisões de que implementação de DAO retornar em uma única classe, vejam:
“Fábrica única” (DAOFactoryUnica):
[code]package Model.DAO;
/**
*
-
@author Leandro
*/
public class DAOFactoryUnica {
public enum Implementacao {
JDBC,
XML,
HIBERNATE;
}
public BairroDAO createBairroDAO(Implementacao impl) {
if(impl == Implementacao.JDBC) {
//Existe implementação para persistência utilizando JDBC:
return new JDBCBairroDAO();
}
else if (impl == Implementacao.XML) {
//Não existe implementação de persistência com XML no momento.
throw new UnsupportedOperationException("Não há implementação para persistência com XML.");
//Se houver implementação será:
//return new XMLBairroDAO;
}
else if(impl == Implementacao.HIBERNATE) {
//Não existe implementação de persistência utilizando Hibernate no momento.
throw new UnsupportedOperationException("Não há implementação para persistência com Hibernate.");
//Se houver implementação será:
//return new HibernateBairroDAO;
}
else {
throw new IllegalArgumentException("Tipo de persistência desconhecida ou não suportada.");
}
}
public CategoriaCursoDAO createCategoriaCursoDAO(Implementacao impl) {
if(impl == Implementacao.JDBC) {
//Existe implementação para persistência utilizando JDBC:
return new JDBCCategoriaCursoDAO();
}
else if (impl == Implementacao.XML) {
//Não existe implementação de persistência com XML no momento.
throw new UnsupportedOperationException("Não há implementação para persistência com XML.");
//Se houver implementação será:
//return new XMLCategoriaCursoDAO;
}
else if(impl == Implementacao.HIBERNATE) {
//Não existe implementação de persistência utilizando Hibernate no momento.
throw new UnsupportedOperationException("Não há implementação para persistência com Hibernate.");
//Se houver implementação será:
//return new HibernateCategoriaCursoDAO;
}
else {
throw new IllegalArgumentException("Tipo de persistência desconhecida ou não suportada.");
}
//... Criação dos demais objetos...
}
}[/code]
Gostaria da opnião e sugestões de vocês, o que acham desse modelo, está errado, pode ser implementado e/ou melhorado?
Obrigado pessoal