Dependency Injection
Propósito
La inyección de dependencias es un patrón de diseño de software en el que una o más dependencias (o servicios)
se inyectan, o se pasan por referencia, a un objeto dependiente (o cliente) y pasan a formar parte del estado del
cliente. El patrón separa la creación de las dependencias de un cliente de su propio comportamiento,
lo que permite que los diseños de los programas estén poco acoplados y sigan los principios de inversión de control y
responsabilidad única.
Explicación
Ejemplo del mundo real
Al viejo mago le gusta llenar su pipa y fumar tabaco de vez en cuando. Sin embargo, no quiere depender de una sola
marca de tabaco, sino que le gusta poder disfrutar de todas ellas de manera intercambiable.
En palabras sencillas
La Inyección de Dependencias separa la creación de las dependencias del cliente de su propio comportamiento.
Wikipedia dice
En ingeniería de software, la inyección de dependencias es una técnica en la que un objeto recibe otros objetos de los
que depende. Estos otros objetos se llaman dependencias.
Ejemplo programático
Presentemos primero la interfaz tabaco Tobacco
y las marcas concretas.
@Slf4j
public abstract class Tobacco {
public void smoke(Wizard wizard) {
LOGGER.info("{} smoking {}", wizard.getClass().getSimpleName(),
this.getClass().getSimpleName());
}
}
public class SecondBreakfastTobacco extends Tobacco {
}
public class RivendellTobacco extends Tobacco {
}
public class OldTobyTobacco extends Tobacco {
}
A continuación se muestra la interfaz Wizard
y su implementación.
public interface Wizard {
void smoke();
}
public class AdvancedWizard implements Wizard {
private final Tobacco tobacco;
public AdvancedWizard(Tobacco tobacco) {
this.tobacco = tobacco;
}
@Override
public void smoke() {
tobacco.smoke(this);
}
}
Y por último podemos demostrar lo fácil que es darle al viejo mago cualquier marca de tabaco Tobacco
.
var advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco());
advancedWizard.smoke();
Diagrama de Clases
Aplicabilidad
Utilice el patrón de Inyección de Dependencia cuando:
- Cuando necesites eliminar el conocimiento de la implementación concreta del objeto.
- Para permitir pruebas unitarias de clases de forma aislada utilizando objetos simulados o stubs.