mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-08-11 00:25:02 +00:00
* Typo corrections * bridge pattern translated to spanish * builder pattern translated to spanish * context-object pattern translated to spanish * converter pattern translated to spanish * dependency injection pattern translated to spanish * factory pattern translated to spanish * factory-kit pattern translated to spanish * factory-method pattern translated to spanish * monostate pattern translated to spanish * multiton pattern translated to spanish * object mother pattern translated to spanish * object pool pattern translated to spanish * property pattern translated to spanish * prototype pattern translated to spanish * registry pattern translated to spanish * step builder pattern translated to spanish * value object pattern translated to spanish * typo corrections and resources urls refactor * grammar corrections * Add image to each pattern --------- Co-authored-by: luismateoh <luismateohm@gmail.com> Co-authored-by: luis.hincapie <luis.hincapie@blankfactor.com>
This commit is contained in:
co-authored by
luismateoh
luis.hincapie
parent
5c1ad5c006
commit
dc7495e8bd
@@ -0,0 +1,103 @@
|
||||
---
|
||||
title: Dependency Injection
|
||||
category: Creational
|
||||
language: es
|
||||
tag:
|
||||
- Decoupling
|
||||
---
|
||||
|
||||
## 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.
|
||||
|
||||
```java
|
||||
@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.
|
||||
|
||||
```java
|
||||
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`.
|
||||
|
||||
```java
|
||||
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.
|
||||
|
||||
## Créditos
|
||||
|
||||
* [Dependency Injection Principles, Practices, and Patterns](https://www.amazon.com/gp/product/161729473X/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=161729473X&linkId=57079257a5c7d33755493802f3b884bd)
|
||||
* [Clean Code: A Handbook of Agile Software Craftsmanship](https://www.amazon.com/gp/product/0132350882/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0132350882&linkCode=as2&tag=javadesignpat-20&linkId=2c390d89cc9e61c01b9e7005c7842871)
|
||||
* [Java 9 Dependency Injection: Write loosely coupled code with Spring 5 and Guice](https://www.amazon.com/gp/product/1788296257/ref=as_li_tl?ie=UTF8&tag=javadesignpat-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=1788296257&linkId=4e9137a3bf722a8b5b156cce1eec0fc1)
|
||||
* [Google Guice: Agile Lightweight Dependency Injection Framework](https://www.amazon.com/gp/product/1590599977/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1590599977&linkId=3b10c90b7ba480a1b7777ff38000f956)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
Reference in New Issue
Block a user