**Patrones Creacionales:**
1. Factory Method:
Descripción: Define una interfaz para crear objetos, pero permite que las subclases decidan qué clase
concreta instanciar.
Uso: Se utiliza cuando se necesita delegar la creación de objetos a las subclases, permitiendo una
mayor flexibilidad en la creación de objetos.
Problema que soluciona: Abstrae el proceso de creación de objetos y permite a las subclases definir la
lógica específica de creación.
2. Abstract Factory:
Descripción: Proporciona una interfaz para crear familias de objetos relacionados sin especificar sus
clases concretas.
Uso: Se utiliza cuando se necesita crear objetos que están interrelacionados o dependen entre sí, pero
se quiere desacoplar el código de las clases concretas.
Problema que soluciona: Permite crear objetos relacionados sin acoplar el código a clases concretas,
facilitando la creación de variantes de productos.
3. Builder:
Descripción: Separa la construcción de un objeto complejo de su representación, permitiendo la
creación de diferentes representaciones utilizando el mismo proceso de construcción.
Uso: Se utiliza cuando se quiere crear un objeto compuesto por múltiples partes y se desea tener
flexibilidad en la construcción de esas partes.
Problema que soluciona: Simplifica la creación de objetos complejos, evitando la necesidad de tener
múltiples constructores con parámetros diferentes.
4. Prototype:
Descripción: Permite la creación de nuevos objetos mediante la clonación de un objeto existente,
evitando así la creación de nuevas instancias.
Uso: Se utiliza cuando se desea crear nuevos objetos a partir de prototipos existentes en lugar de
construirlos desde cero.
Problema que soluciona: Facilita la creación de nuevos objetos al evitar la necesidad de crear nuevas
instancias desde cero, especialmente cuando la creación es costosa.
5. Singleton:
Descripción: Garantiza que una clase tenga una única instancia y proporciona un punto de acceso
global a ella.
Uso: Se utiliza cuando se necesita tener un único objeto compartido en todo el sistema, como una
conexión a una base de datos o un registro de eventos.
Problema que soluciona: Evita la creación de múltiples instancias de una clase y proporciona un acceso
controlado a la misma.
**Patrones Estructurales:**
6. Adapter:
Descripción: Permite que objetos con interfaces incompatibles trabajen juntos al convertir la interfaz
de uno en otra que los clientes esperan.
Uso: Se utiliza cuando se necesita adaptar una clase existente para que sea compatible con una interfaz
requerida.
Problema que soluciona: Permite que objetos con interfaces diferentes trabajen juntos sin cambiar su
código fuente original.
7. Bridge:
Descripción: Desacopla una abstracción de su implementación, permitiendo que ambas varíen
independientemente.
Uso: Se utiliza cuando se desea separar la abstracción de su implementación y permitir que ambas
evolucionen por separado.
Problema que soluciona: Evita el acoplamiento entre una abstracción y su implementación, lo que
facilita la extensibilidad y flexibilidad del sistema.
8. Composite:
Descripción: Permite tratar a los objetos individuales y a las composiciones de objetos de manera
uniforme, creando una estructura jerárquica.
Uso: Se utiliza cuando se desea tratar a los objetos individuales y a las composiciones de objetos de
manera uniforme.
Problema que soluciona: Simplifica la manipulación de estructuras jerárquicas de objetos, permitiendo
tratar a los objetos compuestos e individuales de manera similar.
9. Decorator:
Descripción: Agrega dinámicamente funcionalidades adicionales a un objeto existente sin alterar su
estructura básica.
Uso: Se utiliza cuando se desea agregar funcionalidades a un objeto de manera flexible y sin afectar su
comportamiento original.
Problema que soluciona: Permite agregar funcionalidades adicionales a un objeto de forma dinámica y
modular, evitando la necesidad de crear múltiples clases heredadas con diferentes combinaciones de
funcionalidades.
10. Facade:
Descripción: Proporciona una interfaz simplificada para un conjunto de interfaces más complejas
dentro de un subsistema.
Uso: Se utiliza cuando se desea proporcionar una interfaz unificada y fácil de usar para un subsistema
complejo.
Problema que soluciona: Simplifica el acceso y la utilización de un subsistema complejo al
proporcionar una interfaz de nivel superior.
11. Flyweight:
Descripción: Comparte eficientemente objetos pequeños y granulares para reducir la utilización de
memoria.
Uso: Se utiliza cuando se necesita crear una gran cantidad de objetos similares para reducir la carga de
memoria.
Problema que soluciona: Minimiza la utilización de memoria al compartir objetos comunes en lugar de
crear múltiples instancias idénticas.
12. Proxy:
Descripción: Proporciona un sustituto o representante de otro objeto para controlar su acceso.
Uso: Se utiliza cuando se necesita controlar el acceso a un objeto, ya sea para agregar funcionalidad
adicional o para restringir el acceso a ciertos usuarios.
Problema que soluciona: Proporciona una capa intermedia entre el cliente y el objeto real,
permitiendo controlar el acceso, la seguridad, el rendimiento o la implementación transparente de
funcionalidades adicionales.
**Patrones de Comportamiento:**
13. Chain of Responsibility:
Descripción: Permite que múltiples objetos tengan la oportunidad de manejar una solicitud de manera
secuencial, evitando acoplamientos entre el remitente y el receptor.
Uso: Se utiliza cuando se quiere desacoplar el remitente de los receptores y permitir que varios
objetos tengan la oportunidad de manejar una solicitud.
Problema que soluciona: Simplifica el procesamiento y manejo de solicitudes al evitar acoplamientos
directos y permitir la flexibilidad en la cadena de objetos responsables.
14. Command:
Descripción: Encapsula una solicitud como un objeto, permitiendo parametrizar clientes con diferentes
solicitudes, encolar o registrar solicitudes y admitir operaciones reversibles.
Uso: Se utiliza cuando se desea parametrizar los objetos según las solicitudes que reciben, encolar o
registrar solicitudes para su posterior ejecución, o admitir operaciones reversibles.
Problema que soluciona: Desacopla el objeto que realiza la solicitud del objeto que la procesa, lo que
permite mayor flexibilidad y manejo de solicitudes.
15. Iterator:
Descripción: Proporciona una forma de acceder secuencialmente a los elementos de una colección sin
exponer su representación subyacente.
Uso: Se utiliza cuando se desea recorrer una colección de objetos sin exponer su estructura interna.
Problema que soluciona: Simplifica el acceso y recorrido de elementos de una colección sin acoplar el
código al tipo concreto de la colección.
16. Mediator:
Descripción: Define un objeto que encapsula cómo un conjunto de objetos interactúa, promoviendo
un acoplamiento débil entre ellos.
Uso: Se utiliza cuando se necesita reducir el acoplamiento entre objetos y centralizar la comunicación
y coordinación entre ellos.
Problema que soluciona: Simplifica la comunicación y coordinación entre objetos al proporcionar un
objeto centralizado para controlar las interacciones.
17. Memento:
Descripción: Captura y almacena el estado interno de un objeto sin violar su encapsulación, para
poder restaurarlo más tarde.
Uso: Se utiliza cuando se necesita guardar y restaurar el estado de un objeto sin revelar su estructura
interna.
Problema que soluciona: Permite guardar y restaurar el estado de un objeto de manera transparente,
facilitando la implementación de operaciones de deshacer/rehacer.
18. Observer:
Descripción: Establece una relación uno a muchos entre objetos, de manera que cuando un objeto
cambia su estado, notifica y actualiza automáticamente a todos los objetos dependientes.
Uso: Se utiliza cuando se necesita mantener una sincronización entre diferentes objetos sin acoplarlos
directamente.
Problema que soluciona: Permite la comunicación y actualización automática entre objetos, evitando
el acoplamiento excesivo y simplificando la gestión de cambios de estado.
19. State:
Descripción: Permite que un objeto altere su comportamiento cuando su estado interno cambia,
creando la ilusión de que ha cambiado de clase.
Uso: Se utiliza cuando el comportamiento de un objeto depende de su estado y necesita cambiar
dinámicamente en tiempo de ejecución.
Problema que soluciona: Simplifica la implementación de comportamientos diferentes basados en el
estado de un objeto y evita el uso de múltiples sentencias condicionales.
20. Strategy:
Descripción: Define una familia de algoritmos, encapsula cada uno y los hace intercambiables, lo que
permite que el algoritmo varíe independientemente de los clientes que lo utilizan.
Uso: Se utiliza cuando se desea cambiar dinámicamente el algoritmo utilizado por un objeto en tiempo
de ejecución.
Problema que soluciona: Proporciona una forma flexible de definir e intercambiar algoritmos en
tiempo de ejecución, sin acoplar el código a una implementación concreta.
21. Template Method:
Descripción: Define el esqueleto de un algoritmo en una clase base, permitiendo que las subclases
proporcionen implementaciones concretas para ciertas partes del algoritmo.
Uso: Se utiliza cuando se desea definir un algoritmo general en una clase base, dejando que las
subclases implementen partes específicas.
Problema que soluciona: Evita la duplicación de código y define una estructura general para
algoritmos, permitiendo que las subclases personalicen partes específicas.
22. Visitor:
Descripción: Permite separar algoritmos de la estructura de los objetos en los que operan,
permitiendo agregar nuevos algoritmos sin modificar las clases existentes.
Uso: Se utiliza cuando se necesita realizar operaciones en una estructura de objetos sin modificar las
clases de dicha estructura.
Problema que soluciona: Permite agregar nuevos comportamientos a una estructura de objetos sin
modificar dicha estructura, lo que facilita la extensibilidad y mantenibilidad.
**Otros Patrones:**
23. MVC (Modelo-Vista-Controlador):
Descripción: Separa la representación interna de los datos (Modelo), la presentación y lógica de
interacción con el usuario (Vista) y la lógica de control (Controlador) en componentes independientes.
Uso: Se utiliza para estructurar y separar la lógica de la aplicación en tres componentes principales, lo
que facilita el desarrollo y mantenimiento del software.
Problema que soluciona: Permite la separación de responsabilidades en una aplicación y facilita la
modificación y reutilización de los componentes.
24. MVVM (Modelo-Vista-Modelo de Vista):
Descripción: Extensión del patrón MVC que introduce un Modelo de Vista que se encarga de manejar
la lógica de presentación y la comunicación entre el Modelo y la Vista.
Uso: Se utiliza en aplicaciones que requieren una separación clara entre la lógica de presentación y los
datos, permitiendo una mayor flexibilidad y mantenibilidad.
Problema que soluciona: Separa de manera más clara la lógica de presentación de los datos y facilita el
enlace entre la Vista y el Modelo.
25. ORM (Mapeo Objeto-Relacional):
Descripción: Permite mapear objetos de una aplicación a tablas de una base de datos relacional y
viceversa, simplificando las operaciones de persistencia.
Uso: Se utiliza cuando se desea abstraer la lógica de persistencia de los objetos de una aplicación y
trabajar con ellos de manera más orientada a objetos.
Problema que soluciona: Simplifica el acceso y manipulación de datos en una base de datos relacional,
eliminando la necesidad de escribir consultas SQL directamente.
26. DAO (Objeto de Acceso a Datos):
Descripción: Proporciona una interfaz para acceder y manipular datos en una fuente de datos,
ocultando los detalles de implementación subyacentes.
Uso: Se utiliza cuando se desea abstraer el acceso y manipulación de datos en una fuente de datos,
permitiendo un mayor desacoplamiento del código.
Problema que soluciona: Abstrae las operaciones de acceso a datos, lo que facilita el cambio de la
fuente de datos y mejora la modularidad y mantenibilidad del código.
27. Service Locator:
Descripción: Proporciona una forma de obtener instancias de servicios mediante un servicio
centralizado, en lugar de que los clientes los creen directamente.
Uso: Se utiliza cuando se desea desacoplar los clientes de las implementaciones de servicios y se
necesita un mecanismo centralizado para obtener instancias
de servicios.
Problema que soluciona: Desacopla los clientes de las implementaciones de servicios, lo que facilita la
sustitución y configuración de servicios en tiempo de ejecución.
28. Front Controller:
Descripción: Centraliza el manejo de solicitudes y el enrutamiento en una aplicación web,
proporcionando un punto de entrada único para todas las solicitudes.
Uso: Se utiliza en aplicaciones web para manejar de manera centralizada las solicitudes, controlar el
flujo y enrutamiento de la aplicación.
Problema que soluciona: Centraliza la lógica de manejo de solicitudes y permite un mayor control
sobre el flujo y enrutamiento de una aplicación web.