Sé que esta pregunta es antigua pero me gustaría agregar mis cinco centavos,
Creo que la inyección de dependencia (DI) es en muchos sentidos como un patrón de fábrica configurable (FP), y en ese sentido cualquier cosa que pueda hacer con DI podrá hacerlo con dicha fábrica.
En realidad, si usa spring por ejemplo, tiene la opción de autoabastecer recursos (DI) o hacer algo como esto:
MyBean mb = ctx.getBean("myBean");
Y luego usa esa instancia 'mb' para hacer cualquier cosa. ¿No es una llamada a una fábrica que te devolverá una instancia?
La única diferencia real que noto entre la mayoría de los ejemplos de FP es que puede configurar lo que es "myBean" en un xml o en otra clase, y un marco funcionará como la fábrica, pero aparte de eso es lo mismo, y usted puede tener una fábrica que lea un archivo de configuración u obtenga la implementación según lo necesite.
Y si me preguntas mi opinión (y sé que no lo hiciste), creo que DI hace lo mismo pero solo agrega más complejidad al desarrollo, ¿por qué?
bueno, para empezar, para saber cuál es la implementación que se está utilizando para cualquier bean que conecte automáticamente con DI, debe ir a la configuración misma.
pero ... ¿qué pasa con la promesa de que no tendrá que conocer la implementación del objeto que está utilizando? ¡No! ¿seriamente? cuando usas un enfoque como este ... ¿no eres el mismo que escribe la implementación? e incluso si no lo haces, ¿no estás mirando casi todo el tiempo cómo la implementación hace lo que se supone que debe hacer?
y por último, no importa cuánto te promete un marco DI que construirás cosas desacopladas de él, sin dependencias de sus clases, si estás usando un marco construyes todo en él, si es necesario cambiar el enfoque o el marco no será una tarea fácil ... ¡NUNCA!... pero, dado que construye todo en torno a ese marco en particular en lugar de preocuparse por cuál es la mejor solución para su negocio, se enfrentará a un gran problema al hacerlo.
De hecho, la única aplicación comercial real para un enfoque de FP o DI que puedo ver es si necesita cambiar las implementaciones que se utilizan en tiempo de ejecución , pero al menos los marcos que conozco no le permiten hacer eso, debe irse todo perfecto en la configuración en el momento del desarrollo y si necesita que use otro enfoque.
Entonces, si tengo una clase que funciona de manera diferente en dos ámbitos en la misma aplicación (digamos, dos compañías de una explotación), tengo que configurar el marco para crear dos beans diferentes y adaptar mi código para usar cada uno. ¿No es lo mismo que si simplemente escribiera algo como esto:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
lo mismo que esto:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
Y esto:
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
En cualquier caso, tendrá que cambiar algo en su aplicación, ya sean clases o archivos de configuración, pero deberá hacerlo y volver a implementarlo.
¿No sería bueno hacer algo como esto?
MyBean mb = (MyBean)MyFactory.get("mb");
¿Y de esa manera, configura el código de la fábrica para obtener la implementación correcta en tiempo de ejecución dependiendo de la empresa de usuario registrada? Ahora eso sería útil. Simplemente puede agregar un nuevo jar con las nuevas clases y establecer las reglas, incluso incluso en tiempo de ejecución (o agregar un nuevo archivo de configuración si deja abierta esta opción), sin cambios en las clases existentes. ¡Esta sería una fábrica dinámica!
¿No sería más útil que tener que escribir dos configuraciones para cada empresa, y tal vez incluso tener dos aplicaciones diferentes para cada uno?
Puede decirme que no necesito hacer el cambio en tiempo de ejecución, por lo que configuro la aplicación y, si heredo la clase o uso otra implementación, simplemente cambio la configuración y la vuelvo a implementar. Ok, eso también se puede hacer con una fábrica. Y se honesto, ¿cuántas veces haces esto? tal vez solo cuando tenga una aplicación que se utilizará en otro lugar de su empresa, y vaya a pasar el código a otro equipo, y ellos harán cosas como esta. Pero bueno, eso también se puede hacer con la fábrica, ¡y sería aún mejor con una fábrica dinámica!
De todos modos, la sección de comentarios está abierta para que me mates.