Bom dia, hoje postarei algo sobre o padrão Factory Method, vamos lá...
Design Pattern: São uma coleção de padrões de desenho de software, que são soluções de problemas ocorridos no dia a dia de desenvolvimento de um software (são boas idéias).
Vamos para um exemplo prático: Criarei uma factory para retornar um dos vários objetos DAO's do meu projeto, considere o seguinte diagrama:
Segue a implementação no código deste diagrama:
Esta classe abstrata é a Factory que retorna instancia de outras factories:
Factory para MySql
Factory para Postgres
Interface UserDAO, contém os métodos que os DAO's devem implementar.
DAO para MySQL
DAO para Postgres
Vamos ver como chamariamos as nossas classes:
É isso ae...
[]'s
Design Pattern: São uma coleção de padrões de desenho de software, que são soluções de problemas ocorridos no dia a dia de desenvolvimento de um software (são boas idéias).
Factory Method: este padrão é bem recomendado como por exemplo quando você utiliza vários tipos de bancos de dados em seu projeto, ele é uma fábrica que retorna uma das várias fábricas.
Vamos para um exemplo prático: Criarei uma factory para retornar um dos vários objetos DAO's do meu projeto, considere o seguinte diagrama:
Segue a implementação no código deste diagrama:
Esta classe abstrata é a Factory que retorna instancia de outras factories:
public abstract class DAOFactory {
public abstract UserDAO getUserDAO();
public static DAOFactory getInstance(int whichFactory) {
switch (whichFactory) {
case 1:
return new MySqlUserDAOFactory();
case 2:
return new PostgresUserDAOFactory();
default:
return null;
}
}
}
Factory para MySql
public class MySqlUserDAOFactory extends DAOFactory {
@Override
public UserDAO getUserDAO() {
return new MySqlUserDAO();
}
}
Factory para Postgres
public class PostgresUserDAOFactory extends DAOFactory {
@Override
public UserDAO getUserDAO() {
return new PostgresUserDAO();
}
}
Interface UserDAO, contém os métodos que os DAO's devem implementar.
public interface UserDAO {
public void save(Object o);
}
DAO para MySQL
public class MySqlUserDAO implements UserDAO {
public void save(Object o) {
// TODO Auto-generated method stub
}
}
DAO para Postgres
public class PostgresUserDAO implements UserDAO {
public void save(Object o) {
// TODO Auto-generated method stub
}
}
Vamos ver como chamariamos as nossas classes:
public static void main(String[] args) {
DAOFactory daoFactory = DAOFactory.getInstance(1);
// retorna a factory para MySql
UserDAO userDAO = daoFactory.getUserDAO();
userDAO.save(new Object());
DAOFactory daoFactory2 = DAOFactory.getInstance(2);
// retorna a factory para Postgres
UserDAO userDAO2 = daoFactory2.getUserDAO();
userDAO2.save(new Object());
}
Com isso a nossa implementação termina, um detalhe importante que deve-se notar é que se por um acaso um dia sua empresa decicidir incluir o oracle basta apenas criar uma nova factory OracleUserDAOFactory e estender a classe DAOFactory e pronto, com esse padrão fica muito flexível incluir e excluir qualquer nova implementação.
É isso ae...
[]'s
3 comentários:
Onde este padrão está documentado? É que no GoF temos o Abstract Factory e o Factory Method como dois padrões distintos.
Bruno este artigo pode ajudá-lo entender melhor: http://nullability.org/?p=47
O Bruno mudei o nome, tinha copiado errado... valeu a dica...
Postar um comentário