---
# System prepended metadata

title: Design Patterns

---

# Design Patterns


---

## Nombre: Creator

---

Separe la construcción de un objeto complejo de su representación para que el mismo proceso de construcción pueda crear diferentes representaciones.

---

![](https://i.imgur.com/Mlb1jHI.png)


---

## Problema: ¿Quién crea?

El patrón creador nos ayuda a identificar quién debe ser el responsable de la creación (o instanciación) de nuevos objetos o clases.

#### (Nota: Factory es una solución alternativa común)

---

## Solución: 
Asignar a Class B la responsabilidad de crear una instancia de Class A, si algunas de las siguientes es verdadera:

1. B contiene a A
2. B agrega a A
3. B tiene los datos de inicialización para A
4. B graba a A <!-- records -->
5. B usa de cerca a A <!--  closely uses -->

---

### Use el patrón del generador cuando

El algoritmo para crear un objeto complejo debe ser independiente de las partes que lo componen y de cómo se ensamblan.


---

![](https://i.imgur.com/AYJJa6W.png)

---

### Builder

- Builder
  - Especifica una interfaz abstracta para crear partes de un **objeto Product**.
- ConcreteBuilder
  - Construye y ensambla partes del producto mediante la implementación de la **interfaz Builder**.
  - Define y realiza un seguimiento de la representación que crea.
  - Proporciona una interfaz para recuperar el producto

---


- Director
  - Construye un objeto utilizando la **interface Builder**
- Product
  - Representa el objeto complejo en construcción. **ConcreteBuilder** construye la representación interna del producto y define el proceso mediante el cual se ensambla.
  - Incluye clases que definen las partes constituyentes, incluidas las interfaces para ensamblar las partes en el resultado final.

---

### Beneficios

- Bajo acoplamiento, lo que implica menores dependencias de mantenimiento y mayores oportunidades de reutilización
- Mayor claridad
- Encapsulación
- Reutilización

---

### Ejemplo: Facturación

Se requiere modelar las facturas de un negocio e imprimir en pantalla su contenido. La aplicación principal tiene un conjunto de productos y crea las facturas a partir de estos. Sobre cada factura se desea saber su número (consecutivo), nombre del cliente, fecha y las líneas que la componen. La factura tiene un subtotal que se calcula sumando el costo de todas sus líneas. Al subtotal se le aplica un impuesto de ventas que es un porcentaje fijo. El total de la factura se calcula sumando el subtotal más los impuestos. Cada línea tiene cantidad, un producto asociado y un costo que se calcula a partir del precio del producto y la cantidad que indica la línea. Sobre cada producto se desea saber su código, descripción y precio. Cada venta es de uno o más artículos de uno o más tipos de productos y ocurre en una fecha determinada. Un producto tiene una especificación que incluye una descripción, precio unitario, un identificador.

---

![](https://i.imgur.com/fKDieQC.png)


---

La existencia de las líneas depende de la factura a la que pertenecen. Cada línea tiene un producto asociado, pero cada producto es independiente de las facturas que lo hayan utilizado. El patrón **Creador** sugiere que la clase *Factura* es un buen candidato para tener la responsabilidad de crear instancias de *Linea*.


---

Muchas gracias compañeros! 