Please enable JavaScript.
Coggle requires JavaScript to display documents.
image Patrones de diseño - Coggle Diagram
Patrones de diseño
Creacionales
Factory Method
-
Ventajas:
- Reduce el acoplamiento entre el código y las clases concretas.
- Facilita agregar nuevos tipos de productos.
-
Características:
- Crear objetos sin especificar explícitamente la clase concreta, delegando la creación a subclases.
- Crear objetos sin especificar explícitamente la clase concreta, delegando la creación a subclases.
- Crear objetos sin especificar explícitamente la clase concreta, delegando la creación a subclases.
Propósito: Crear objetos sin especificar explícitamente la clase concreta, delegando la creación a subclases.
Abstract Factory
Propósito: Proveer una interfaz para crear familias de objetos relacionados sin especificar sus clases concretas.
-
Ventajas:
- Asegura que los productos creados sean compatibles.
- Permite cambiar completamente la apariencia/lógica del sistema.
Características:
- Crea grupos de objetos compatibles entre sí.
- Garantiza coherencia entre productos de la misma familia.
- Facilita cambiar familias completas sin afectar el código cliente.
Uso específico: Cuando se necesita crear familias de objetos que deban funcionar juntos (p. ej., kits completos de UI).
Builder
Propósito: Construir objetos complejos paso a paso, permitiendo diferentes representaciones del mismo proceso.
Caso de uso: Documentos complejos (PDF/HTML), configuración de objetos.
Ventajas:
- Permite crear objetos inmutables y complejos.
- Evita constructores con demasiados parámetros.
Características:
- Construir objetos complejos paso a paso, permitiendo diferentes representaciones del mismo proceso.
- Facilita crear versiones diferentes del mismo objeto.
- Controla la creación de objetos muy complejos.
-
Prototype
Propósito: Crear nuevos objetos mediante la copia de instancias existentes (clonar), en lugar de instanciarlas desde cero.
-
Ventajas:
- Ahorra tiempo y recursos cuando la creación es costosa.
- Permite copiar objetos complejos fácilmente.
Características:
- Usa un método clone() para duplicar objetos.
- Ideal para objetos costosos de crear.
- Ideal para objetos costosos de crear.
Uso específico: Cuando necesitas crear múltiples objetos similares y costosos de configurar desde cero.
Singleton
Propósito: Garantizar que exista una sola instancia de una clase y proporcionar un punto global de acceso a ella.
Caso de uso: Conexión BD, logging, configuración global.
Ventajas:
- Evita duplicación de recursos globales.
- Facilita el acceso controlado a una instancia central.
Características:
- Controla la instancia única mediante un método estático.
- Impide el acceso mediante new.
- Centraliza recursos compartidos.
Uso específico: Cuando solo debe existir una instancia en toda la aplicación (configuraciones, conexión a base de datos, logging, etc.).
Estructurales
Facade
Caso de uso: Módulo de pagos que en lugar de que el cliente llame a servicios distintos, la fachada expone realizar orden.
Ventajas:
- Interfaz mucho más sencilla para el cliente.
- Reduce acoplamiento hacia sub sistemas internos.
Características:
- Un punto de entrada simplificado.
- Esconde la complejidad interna.
- Reduce dependencias entre módulos.
-
-
Adapter
Propósito: Permitir que dos clases con interfaces incompatibles trabajen juntas mediante un “adaptador”.
Caso de uso: Un sistema nuevo necesita usar un servicio externo que expone datos en XML, la aplicación trabaja con JSON.
Se crea un Adapter que convierte XML JSON para no reescribir todo el sistema.
Ventajas:
- Reutiliza clases existentes sin modificarlas.
- Permite la comunicación entre interfaces incompatibles.
Características:
- Traduce la interfaz de una clase a otra compatible.
- Evita modificar el código original.
- Facilita integrar sistemas antiguos y nuevos.
-
Decorator
Propósito: Agregar funcionalidades adicionales a un objeto dinámicamente sin alterar su código original.
Caso de uso: Notificaciones con cifrado, compresión, formateo.
Ventajas:
- Flexibilidad total para agregar/quitar funcionalidades.
- Menos complejidad que heredar múltiples clases.
Características:
- Decoradores apilables.
- Extiende comportamiento sin herencia.
- Muy usado en procesamiento de datos.
Uso específico: Cuando necesitas agregar responsabilidades opcionales (validación, logging, seguridad, caching).
Composite
Propósito: Permitir trabajar con objetos individuales y colecciones de manera uniforme en estructuras jerárquicas.
Caso de uso: Sistema archivos (carpetas/archivos), menús con sub menús.
Ventajas:
- Asegura que los productos creados sean compatibles.
- Permite cambiar completamente la apariencia/lógica del sistema.
Características:
- Permite gestionar componentes anidados fácilmente.
- Simplifica operaciones complejas en estructuras jerárquicas.
Uso específico: Cuando trabajas con estructuras de árbol (interfaces de usuario, permisos, archivos, categorías, etc.).
Bridge
Propósito: Separar la lógica de alto nivel (abstracción) de su implementación real, permitiendo que ambos cambien de forma independiente.
Caso de uso: Un módulo de Reportes que puede generar reportes en PDF, HTML, Excel.
Ventajas:
- Facilita agregar nuevas implementaciones sin afectar la lógica.
- Elimina duplicación de código.
-
Características:
- Dos jerarquías independientes: Abstracción y Implementación.
- Evita explosión de combinaciones de clases.
- Facilita la expansión modular del sistema.
Flyweight
Propósito: Compartir objetos pesados para reducir el consumo de memoria cuando se instancian en grandes cantidades.
Características:
- Estado compartido (intrínseco) y estado externo (extrínseco).
- Reduce uso de RAM.
- Muy útil en sistemas de alto volumen.
-
Ventajas:
- Ahorro significativo de memoria.
- Ideal para sistemas con muchos objetos repetitivos.
Uso específico: Cuando tienes miles/millones de objetos muy similares (listados, elementos de UI, nodos gráficos, etc.).
Proxy
-
Características:
- Interfaz idéntica al objeto real.
- Puede agregar lógica antes o después.
- Ideal para optimización o seguridad.
-
Ventajas:
- Mejor rendimiento (carga diferida, caching).
- Control centralizado del acceso.
Uso específico: Cuando necesitas controlar un recurso costoso o restringido (BD, servicios remotos, archivos grandes).
Comportamiento
Memento
-
-
Ventajas:
- Implementa undo/restore sin exponer lógica interna.
- Fácil manejo de versiones temporales.
Características:
- Estado capturado externamente.
- Restauración segura.
- No expone detalles internos.
-
Command
Propósito: Encapsular una operación como un objeto para ejecutar, deshacer o programar acciones.
Caso de uso: Undo/redo en un editor: insertar texto, borrar texto, mover cursor.
Ventajas:
- Facilita deshacer y rehacer.
- Desacopla quien ejecuta del que realiza la acción.
Características:
- Operación = objeto.
- Soporta undo/redo.
- Permite colas y macros de comandos.
-
Decorator
Propósito: Controlar la comunicación entre múltiples objetos para reducir el acoplamiento directo entre ellos.
Caso de uso: Formularios complejos, seleccionar país activa estados, estados activan ciudades, sin que los componentes se conozcan entre sí.
Ventajas:
- Reduce dependencias entre componentes.
- Facilita mantenimiento y extensibilidad.
Características:
- Interacciones centralizadas.
- Componentes independientes entre sí.
- Simplifica sistemas con mucha comunicación interna.
-
Iterator
-
-
Ventajas:
- Simplifica el recorrido.
- Reduce acoplamiento con la estructura interna.
Características:
- Acceso secuencial.
- Interfaz uniforme para diferentes colecciones.
- Oculta la estructura interna.
-
Chain of Responsibility
Propósito: Permitir que varios objetos procesen una solicitud secuencialmente sin acoplamiento entre ellos.
Caso de uso: Validación de peticiones HTTP: autenticación, permisos, formato, reglas de negocio.
Ventajas:
- Alta flexibilidad al agregar o quitar pasos.
- Evita condicionales anidados gigantes.
-
Características:
- Handlers encadenados..
- Cada uno procesa o delega.
- Fácil de extender añadiendo nuevos handlers.
Observer
-
Características:
- Suscripción y notificación.
- Comunicación 1 → N.
- Actualizaciones automáticas.
-
Ventajas:
- Reduce acoplamiento.
- Sincronización automática entre componentes.
-
State
-
Características:
- Estados encapsulados en clases.
- Transiciones claras.
- Elimina condicionales extensos.
Caso de uso: Flujo de pedido: creado, pagado, enviado, entregado, cancelado.
Ventajas:
- Código limpio y sin condicionales repetitivos.
- Permite agregar nuevos estados fácilmente.
-
Strategy
Propósito: Definir una familia de algoritmos intercambiables que se puedan seleccionar en tiempo de ejecución.
Características:
- Algoritmos encapsulados.
- Selección dinámica.
- Misma interfaz, diferentes implementaciones.
Caso de uso: Estrategias de cálculo de descuentos: por porcentaje, por categoría, por volumen, por promoción.
Ventajas:
- Permite cambiar algoritmos sin tocar el código cliente.
- Facilita pruebas A/B y configuración dinámica.
-
Template Method
Propósito: Definir la estructura de un proceso dejando que las subclases implementen pasos específicos.
Características:
- Flujo fijo.
- Pasos sobre escribibles.
- Reutilización del algoritmo base.
Caso de uso: Proceso de exportación: generar datos, formatear, escribir archivo, variando solo el formato final (PDF, Excel, CSV).
Ventajas:
- Evita duplicación de procesos similares.
- Permite variaciones controladas.
-
Visitor
-
Características:
- Separación entre datos y operaciones.
- Permite agregar funcionalidades sin alterar nodos.
- Ideal para estructuras estables.
Caso de uso: Árbol sintáctico en un compilador: visitors para validación de tipos, optimización y generación de código.
Ventajas:
- Facilita agregar nuevas operaciones.
- Evita modificar clases existentes.
-
Emergentes
MVVM
Caso de uso: En Android (Jetpack) o Flutter, usar un ViewModel para manejar estados (lista de productos, usuario, sesión) enlazado a la UI con LiveData/Streams.
Ventajas:
- Facilita pruebas unitarias.
- Menos código en la interfaz.
Características:
- La Vista refleja automáticamente cambios del ViewModel.
- Reduce código repetitivo en pantallas.
- Muy usado en interfaces reactivas.
Uso específico: Cuando se requiere UI reactiva, especialmente en apps móviles o de escritorio.
Propósito: Separar los datos, la vista y la lógica de presentación con soporte de data binding.
MVC
Propósito: Separar la lógica de negocio, la interfaz y el control de flujo para facilitar la mantenibilidad.
Caso de uso: Estructurar una aplicación web como Laravel, Spring MVC o ASP.NET MVC, donde el Controlador recibe peticiones, el Modelo procesa datos y la Vista renderiza HTML.
Ventajas:
- Separación clara de responsabilidades.
- Facilita cambios en UI sin afectar lógica.
Características:
- Divide el sistema en Modelo, Vista y Controlador.
- Facilita las pruebas unitarias y cambios en la interfaz.
- Reduce el acoplamiento entre componentes.
Uso específico: Cuando necesitas una arquitectura limpia para aplicaciones web con muchas vistas y controladores.
DDD
Caso de uso: Diseñar un sistema para gestión de inventarios usando entidades como Producto, Almacén, Movimiento, y agregados con reglas estrictas de negocio.
Ventajas:
- Código alineado al negocio real.
- Facilita mantenimiento a largo plazo.
Características:
- Uso de Ubiquitous Language.
- Entidades, Agregados, Repositorios y Servicios de Dominio.
- Enfoque profundo en reglas de negocio.
Uso específico: Ideal para sistemas grandes y complejos, con reglas de negocio cambiantes.
-
CQRS
-
Caso de uso: En un sistema de e-commerce, usar un modelo optimizado para escribir órdenes de compra, y otro modelo optimizado para consultar productos en alta velocidad.
Ventajas:
- Alto rendimiento en lectura.
- Escalabilidad horizontal.
Características:
- Un modelo para comandos (insert/update/delete).
- Otro modelo separado para consultas.
- Permite optimizaciones independientes para cada parte.
Uso específico: Cuando hay mucho tráfico de consultas y se requiere separar la carga de lectura/escritura.
DAO
-
Caso de uso: Crear una clase UsuarioDAO con métodos insert, update, delete y find para interactuar con MySQL en una API sin que el servicio conozca SQL.
Ventajas:
- Código más limpio y reutilizable.
- Cambio sencillo de BD.
Uso específico: Cuando la app necesita independencia entre lógica de negocio y persistencia de datos.
Características:
- Centraliza operaciones CRUD.
- Oculta detalles de la base de datos (SQL/ORM).
- Facilita cambios de proveedor de BD.
MVP
Características:
- Vista pasiva: solo muestra datos.
- Presentador recibe eventos y actualiza la vista.
- Reemplaza al controlador tradicional.
Caso de uso: En Android (arquitecturas antiguas), un Presenter se encarga de pedir datos a un repositorio y actualizar una Activity sin lógica compleja en la UI.
Ventajas:
- Control claro de la lógica de presentación.
- Muy testeable.
Uso específico: Aplicaciones donde la UI debe ser muy simple y la lógica de presentación muy controlada.
Propósito: Separar la lógica de presentación de la UI usando un Presentador que actúa como intermediario.