terça-feira, 12 de junho de 2007

Tutorial Abstract Factory Method...

Bom dia, hoje postarei algo sobre o padrão Abstract 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).

Abstract 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 wichFactory) {
switch (wichFactory) {
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

Um comentário:

Eduardo disse...

BOA Alberto, parabéns =)