Desenvolvendo uma aplicação costumava criar uma interface para cada repositório e uma implementação correspondente para cada tipo de persitência, nos controladores de cada entidade tinha um atributo do tipo da interface de repositório e costumava fazer dos meus controladores singletons , nos quais em seus construtores instanciaria a classe q implementa o tipo de repositorio. Um colega meu falou sobre uma padrão chamado Dependency Injection, q livra o controlador de instanciar diretamente a classe concreta q implementa a interface do repositório. Achei um artigo no javafree.org (http://www.javafree.org/content/view.jf?idContent=1), bem generoso, q fala sobre tal padrão. Em linhas gerais eu entendi o funcionamento, mas tenhos duas perguntas:
1: O padrão dependency injection depende dos tais containers dos quais o Martin Fowler citou?? (Spring, picocontainer, etc)???
2: Consegui entender q ao utilizar o tal padrão eu realmente me livro de instanciar a classe concreta no controlador, porém tenho toda uma parafernália adicional, e definitivamente em algum momento terei q definir qual classe concreta desejo instanciar. Será q vale tanta complexidade??
Eu sou iniciante no mundo dos design patterns, me perdoem se estou falando besteira, mas eh q essas questões a mim n ficaram claras.
Segue um código simples de como costumo estruturar meus sistemas, supondo repositórios e controladores referentes a uma entidade arbitrária, Pessoa:
public interface IRepositorioPessoa {
//Métodos do repositório
}
public class RepositorioPessoaMySQL implements IRepositorioPessoa{
private static RepositorioPessoaMySQL instance = null;
private RepositorioPessoaMySQL(){}
public static RepositorioPessoaMySQL getInstance(){
if (instance == null){
instance = new RepositorioPessoaMySQL();
}
return instance;
}
//Métodos concretos definidaos pela interface
}
public class ControladorPessoa {
private IRepositorioPessoa repositorio;
private static ControladorPessoa instance;
private ControladorPessoa(){
repositorio = RepositorioPessoaMySQL.getInstance();
}
public static ControladorPessoa getInstance(){
if (instance == null){
instance = new ControladorPessoa();
}
return instance;
}
//Métodos do controlador
}
Se possível comentem sobre o q vcs acham da minha abordagem (se existem melhores forams de estruturar) e caso o Dependency Injection fosse agregar valor à implementação, implementaria o tal padrão? Teria q usar os Containers leves??
Antecipadamente obrigado a todos.