Skip to content

Clase 18 — Taller 03: Repaso de Patrones de Diseño y Dudas de Examen

Resumen Ejecutivo

Taller de resolución de dudas (Tema = repaso de patrones de diseño) de cara al examen, comentando la actividad 2. El profesor recorre patrón a patrón cuándo tiene sentido aplicarlos y qué debe verse en el examen, partiendo de la crítica de que muchos trabajos fueron "clónicos" (Adapter + Facade + Observer) y de errores comunes de notación UML.

Estructura del repaso: - Notación UML (significado de las flechas). - Creacionales: Builder, Prototype, Singleton, Abstract Factory. - Estructurales: Adapter, Facade, Proxy, Composite. - Comportamiento: Chain of Responsibility, Mediator, Observer, State. - Consejos de examen.

⚠️ EXAMEN: lo que más se valora es que el diagrama de clases UML esté bien, que el patrón esté bien representado y que se identifiquen las interfaces y los métodos clave. La originalidad cuenta poco. La pregunta teórica ofrece 2 temas a elegir (¡pueden ser del mismo capítulo! → no dejar ningún tema sin estudiar). Examen pensado para 1h30.


Conceptos Clave

  • Notación UML de flechas: ⚠️ EXAMEN
  • Flecha abierta (línea continua): relación de uso/dependencia (una clase usa otra; sentido = quién usa a quién).
  • Triángulo + línea continua: herencia.
  • Triángulo + línea discontinua: implementación (de interfaz).
  • Asociación, agregación y composición: más "opinables".
  • Regla de oro de los patrones: usarlos con mesura ("no matar moscas a cañonazos"); un patrón solo vale si simplifica la vida. El contexto es imprescindible para justificarlo. ⚠️ EXAMEN
  • Builder: construir objetos complejos con muchos parámetros heterogéneos paso a paso (evita constructores de 20 booleanos). Métodos tipo addPart/setX + build/getResult. ⚠️ EXAMEN
  • Prototype: clonar objetos idénticos o casi (interfaz clonar/clone). ⚠️ EXAMEN
  • Singleton: instancia única (atributo privado con la instancia, constructor privado, método estático que devuelve la referencia). ⚠️ EXAMEN
  • Proxy: sustituto con la misma interfaz que el objeto real; usos: lazy load y caché. ⚠️ EXAMEN
  • Composite: jerarquías/agrupaciones donde una operación se propaga en cascada. ⚠️ EXAMEN
  • State: cambia el comportamiento según el estado; solo si cada estado requiere especialización real (no para meros atributos). ⚠️

Desarrollo del Temario

1. Notación UML (errores comunes)

No basta con dibujar "rectángulos con flechas" y escribir "implementa". Hay que respetar UML:

classDiagram
    class Cliente
    class Interfaz {
        <<interface>>
    }
    class ClaseConcreta
    Cliente ..> Interfaz : usa (flecha abierta)
    ClaseConcreta ..|> Interfaz : implementa (triángulo discontinuo)
    ClaseConcreta --|> ClaseBase : hereda (triángulo continuo)

En los patrones predominan realización (implementa interfaz) y dependencia (uso). Un diagrama bien hecho ≠ uno inventado.

2. Patrones creacionales

Builder

Para objetos complejos con muchos parámetros (ejemplo de la pizza: en vez de new Pizza(true,true,false,true...), métodos tieneQueso(), addExtra()...). Evita errores (pedir "extra de queso" tras decir "sin queso") y deja el código más limpio. Otros casos: configurar personaje de videojuego, documentos (encabezado/cuerpo/índice), UriBuilder. La interfaz Builder es discutible aquí (suele bastar un builder concreto), pero conviene mostrarla por el contrato/estándar (build/getResult).

Prototype

Copiar objetos idénticos con pequeñas variaciones (tuerca R45 → R46; ejército de soldados; murciélagos del Zelda; copia-pega en PowerPoint/Photoshop). Lo clave: todo objeto clonable implementa la interfaz clonar con el método clone. Clase abstracta Forma (posición, color, clonar abstracto) → Rectángulo, Círculo...

Singleton

Clases costosas de construir o cuya inicialización requiere conexión/credenciales (acceso a BD, APIs). En el examen: atributo privado con la instancia, constructor privado y método que devuelve la referencia. Nombre semántico (no genérico).

Abstract Factory

Familias de productos (factoría de productos 1, 2, 3). Muy combinable con el Adapter.

3. Patrones estructurales

Adapter

Familias de componentes que hacen lo mismo pero con interfaces diferentes (intercambiar librerías de dibujo, IA, mapas, tablas de React). Se crean clases propias que implementan una interfaz genérica → más desacoplamiento.

Facade

Muy usado y fácil de entender: traslada el acoplamiento a una clase especializada en gestionar dependencias (librerías/APIs de terceros). No elimina el acoplamiento, lo encapsula → el código cliente no cambia ante cambios en el subsistema.

Proxy

Sustituto con las mismas operaciones que el objeto real (interfaz/clase común). Dos usos muy distintos: - Lazy load: retrasar la carga hasta que es imprescindible (listas con scroll en Android/iOS reciclan componentes; resultados de búsqueda de gasolineras). - Caché: cachear información (encaja en casi cualquier aplicación → "todos vais a meter un proxy de caché").

Composite

Jerarquías/agrupaciones donde una operación se propaga en cascada desde la raíz: comentarios de blog, personajes (tronco/cabeza/extremidades), empleados, edificios, piezas en CAD/AutoCAD, agrupar formas en PowerPoint, aplicar descuento a una categoría de inventario, estilos en cascada de un documento Word. El cliente solo conoce la raíz; hay un elemento/operación abstracta.

4. Patrones de comportamiento

Chain of Responsibility

Un evento que puede ser procesado por distintos objetos; cada uno lo maneja o lo pasa al siguiente (abrir un archivo: cada clase intenta abrirlo según su tipo; eventos de ratón en un editor gráfico). Distinto de tuberías y filtros (arquitectónico, orientado a información que atraviesa procesos: moderación de comentarios → spam → etiquetado → análisis de sentimiento → traducción).

Mediator

Reduce el acoplamiento entre objetos que se comunican (interfaces gráficas con muchos controles). Muy combinable con Observer. Ejemplo curioso: robótica de enjambre (swarm) — control peer-to-peer vs. controlador central (relacionado con maestro-esclavo); analogía de la orquesta (director = mediador) vs. cuarteto de cuerda.

Observer

Algo que es observado y, al cambiar, actualiza otros elementos: indicador de fortaleza de contraseña (barra + color + mensaje observando el campo de texto).

State

Cambia el comportamiento del objeto según su estado. Solo si cada estado requiere especialización real (evita el switch gigante; mejora la cohesión). Buenos ejemplos: lavadora (programa acrílicos/algodón con fases distintas), robot de cocina/Thermomix, máquina de estados de un videojuego (correr/andar/saltar con lógica de transiciones complejas), personaje herido que no puede disparar/saltar, vehículo en modo automático/manual.

⚠️ Cuándo NO usar State: el "control Z" o el estado abierta/cerrada de una gasolinera no cambian el comportamiento del objeto (basta un atributo). En la app de gasolineras los estados son atributos en BD, no comportamiento en ejecución → "con calzador".

5. Consejos de examen ⚠️ EXAMEN

  • Lo más valorado: UML correcto, patrón bien representado, interfaces y métodos clave identificados. La originalidad cuenta poco (si todos usan Proxy de caché, no pasa nada — pero bien hecho).
  • Pregunta teórica: se eligen 2 temas, pero pueden ser del mismo capítulo → no dejar ningún tema sin estudiar. Se responde en ~15 min.
  • Examen pensado para 1h30 (con margen si se sabe).
  • Error recurrente a evitar: hablar de MVC/patrones de diseño en una pregunta que solo pedía prototipar la interfaz (dibujo).

Preguntas de Autoevaluación

  1. ¿Qué significan en UML la flecha abierta, el triángulo con línea continua y el triángulo con línea discontinua?
  2. ¿Cuándo conviene un Builder? ¿Por qué la interfaz Builder es discutible y qué métodos suele tener?
  3. ¿Qué problema resuelve el Prototype y qué interfaz/método lo caracteriza?
  4. En el examen, ¿qué tres elementos debe mostrar un Singleton?
  5. Diferencia los dos usos del Proxy (lazy load vs. caché). ¿Por qué la caché encaja en casi cualquier app?
  6. ¿Qué caracteriza al Composite y qué relación tiene el cliente con la jerarquía?
  7. Diferencia Chain of Responsibility de tuberías y filtros.
  8. ¿Cuándo tiene sentido el patrón State y cuándo es "con calzador"? Pon un ejemplo de cada caso.
  9. ¿Por qué la Facade no elimina el acoplamiento? ¿Qué hace con él?
  10. ¿Qué se valora más en el examen y por qué no hay que dejar ningún tema sin estudiar aunque haya 2 a elegir?