Sei que essa pergunta é antiga, mas gostaria de adicionar meus cinco centavos,
Eu acho que a injeção de dependência (DI) é, de várias maneiras, como um padrão de fábrica (FP) configurável e, nesse sentido, qualquer coisa que você possa fazer com o DI poderá fazê-lo com essa fábrica.
Na verdade, se você usar o Spring, por exemplo, terá a opção de autowiring resources (DI) ou fazer algo assim:
MyBean mb = ctx.getBean("myBean");
E então use essa instância 'mb' para fazer qualquer coisa. Não é uma ligação para uma fábrica que retornará uma instância?
A única diferença real que noto entre a maioria dos exemplos de FP é que você pode configurar o que "myBean" é em um xml ou em outra classe, e uma estrutura funcionará como a fábrica, mas, além disso, é a mesma coisa, e você certamente pode ter um Factory que leia um arquivo de configuração ou obtenha a implementação conforme necessário.
E se você me pede a minha opinião (e eu sei que não), acredito que o DI faz a mesma coisa, mas apenas acrescenta mais complexidade ao desenvolvimento, por quê?
bem, por um lado, para você saber qual é a implementação que está sendo usada para qualquer bean que você usa automaticamente com DI, você precisa acessar a própria configuração.
mas ... e a promessa de que você não precisará conhecer a implementação do objeto que está usando? pfft! a sério? quando você usa uma abordagem como esta ... você não é o mesmo que escreve a implementação? e mesmo que não o faça, você não fica quase o tempo todo olhando como a implementação faz o que deveria fazer?
e, por último, não importa o quanto uma estrutura DI prometa que você construa coisas dissociadas dela, sem dependências de suas classes, se você estiver usando uma estrutura, construa tudo ao seu redor, se precisar mudar a abordagem ou a estrutura, não será uma tarefa fácil ... NUNCA! ... mas, como você constrói tudo em torno dessa estrutura específica, em vez de se preocupar com qual é a melhor solução para o seu negócio, você enfrentará um grande problema ao fazer isso.
De fato, o único aplicativo de negócios real para uma abordagem FP ou DI que eu posso ver é se você precisar alterar as implementações usadas no tempo de execução , mas pelo menos as estruturas que conheço não permitem que você faça isso, você deve sair tudo perfeito na configuração no momento do desenvolvimento e, se você precisar, use outra abordagem.
Portanto, se eu tiver uma classe que tenha desempenho diferente em dois escopos no mesmo aplicativo (digamos, duas empresas de uma holding), tenho que configurar a estrutura para criar dois beans diferentes e adaptar meu código para usar cada um. Não é o mesmo que escrever apenas algo assim:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
o mesmo que este:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
E isto:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
De qualquer forma, você terá que alterar algo em seu aplicativo, sejam classes ou arquivos de configuração, mas precisará realizá-lo e reimplementá-lo.
Não seria bom fazer algo assim:
MyBean mb = (MyBean)MyFactory.get("mb");
Dessa forma, você define o código da fábrica para obter a implementação correta em tempo de execução, dependendo da empresa do usuário registrado? Agora isso seria útil. Você pode simplesmente adicionar um novo jar com as novas classes e definir as regras, talvez também em tempo de execução (ou adicionar um novo arquivo de configuração, se você deixar esta opção em aberto), sem alterações nas classes existentes. Esta seria uma fábrica dinâmica!
isso não seria mais útil do que ter que escrever duas configurações para cada empresa e talvez até ter dois aplicativos diferentes para cada uma?
Você pode me dizer que eu não preciso fazer a alternância no tempo de execução, portanto, eu configuro o aplicativo e, se eu herdar a classe ou usar outra implementação, basta alterar a configuração e reimplementar. Ok, isso também pode ser feito com uma fábrica. E seja honesto, quantas vezes você faz isso? talvez apenas quando você tiver um aplicativo que será usado em outro lugar da sua empresa e você passará o código para outra equipe, e eles farão coisas assim. Mas ei, isso também pode ser feito com a fábrica e seria ainda melhor com uma fábrica dinâmica !!
De qualquer forma, a seção de comentários está aberta para você me matar.