Los 23 patrones, un archivo corto cada uno.Cada patrón GoF es un archivo Java 21 de 22–56 líneas (mediana 32) con records, tipos sealed y coincidencia de patrones: sin código repetitivo de getters.
Las 34 pruebas pasan en Java 21 y Java 25.Descomprime y ejecuta mvn test: 23 clases de prueba JUnit 5, 0 fallos. La salida debajo de cada ejemplo es la salida real de ese archivo.
Pago único, sin suscripción.Lee todos los patrones aquí gratis. El kit completo (proyecto Maven, PDF de 30 páginas, 69 ejercicios, reglas para IA) es una compra única.
Busca la frase que coincida con tu código y luego haz clic en el patrón.
Tu código tiene esta situación
Patrón
NO lo uses cuando
Líneas
Creacionales
Un objeto compartido, y una segunda copia sería un error
No para cosas que necesitas sustituir en las pruebas (una base de datos, un reloj): pásalas como parámetro.
22
Una clase base ejecuta los pasos y las subclases eligen qué objeto crea
No cuando solo hay una clase de producto: basta con un constructor o un método de fábrica estático.
32
Varios objetos deben pertenecer a la misma familia (región, tema, base de datos)
No cuando hay un solo tipo de producto, o cuando las familias nunca se mezclan: añade clases sin ningún beneficio.
29
Muchos campos opcionales, o el objeto debe ser válido antes de que nadie lo vea
No para un registro con 2-3 campos todos obligatorios: el constructor canónico es más claro.
37
Los objetos nuevos empiezan como copia de una plantilla configurada
No cuando los objetos son baratos de construir; y ojo con las copias superficiales de campos mutables.
28
Estructurales
Una clase que no puedes editar tiene la interfaz incorrecta
No cuando controlas ambos lados: cambia la interfaz en lugar de añadir un traductor.
28
Dos cosas varían de forma independiente y las subclases se multiplican (tipo × canal)
No cuando una de las dos dimensiones tiene una sola variante.
31
Un árbol donde un elemento y un grupo de elementos deben tratarse igual
No cuando tus datos son planos, o cuando las hojas y los grupos necesitan operaciones muy distintas.
25
Añadir comportamientos opcionales en cualquier combinación en tiempo de ejecución
No cuando el orden de los extras no debe importar: los envoltorios se aplican en orden de pila.
30
Los clientes repiten la misma secuencia de varios pasos en varias clases
No como lugar para ocultar toda la lógica: una fachada coordina, no debe convertirse en una clase dios.
46
Miles de objetos repiten los mismos datos pesados
No cuando hay pocos objetos o la parte compartida es pequeña: añades una fábrica por poco beneficio.
32
Controlar el acceso a un objeto lento, remoto o protegido sin cambiar a los clientes
No cuando la capa extra oculta fallos que los clientes deben manejar (errores de red tras una interfaz 'local').
33
De comportamiento
Una petición pasa por una cadena de manejadores hasta que uno la atiende
No cuando siempre se aplica exactamente un manejador fijo: una llamada directa es más clara y fácil de depurar.
26
Las acciones deben encolarse, registrarse, reintentarse o deshacerse
No para llamadas puntuales que nunca encolas ni deshaces: es ceremonia de más.
44
Los usuarios escriben reglas o fórmulas en un pequeño lenguaje que debes evaluar
No para lenguajes grandes o que cambian rápido: usa un generador de parsers (ANTLR) o un motor de expresiones existente.
56
Recorrer elementos sin saber cómo están almacenados
No cuando un Stream o una colección existente ya te dan lo que necesitas.
30
Muchos objetos se comunican entre sí y las referencias se enredan
No cuando el mediador crece hasta convertirse en una clase dios que posee toda la lógica.
37
Guardar y restaurar el estado de un objeto sin exponer sus campos
No cuando las instantáneas son grandes y frecuentes: guarda cambios (comandos) en su lugar.
36
Cuando cambia un objeto, otros deben reaccionar
No cuando la reacción debe ocurrir en un orden estricto o en una sola transacción: llámala directamente.
30
El comportamiento depende de un estado y cada método usa un switch sobre él
No para dos o tres estados con reglas simples: un enum y un switch bastan.
42
Varias formas intercambiables de hacer una tarea, elegidas en tiempo de ejecución
No cuando hay un solo algoritmo que nunca cambia.
24
Los mismos pasos en el mismo orden; solo algunos pasos varían
No cuando los pasos varían libremente: pasa una Estrategia en lugar de forzar la herencia.
34
Nuevas operaciones sobre un conjunto fijo de tipos, sin editar los tipos
No cuando el conjunto de tipos cambia a menudo: cada tipo nuevo obliga a editar todos los visitantes.
52
Preguntas de entrevista sobre patrones de diseño (69, con respuestas breves)
Tres por patrón. Di la respuesta en voz alta primero y luego ábrela.
Singleton 3 preguntas
¿Por qué un enum es el Singleton más seguro en Java?
La JVM crea la constante una sola vez, de forma segura entre hilos, y la serialización de enums y la reflexión no pueden crear una segunda.
¿Qué tiene de malo la inicialización perezosa que comprueba `instance == null` sin bloqueo?
Dos hilos pueden ver null a la vez y crear dos instancias; necesitas una clase holder, un enum, o doble comprobación con bloqueo sobre un campo volatile.
¿Por qué la gente llama anti-patrón al Singleton?
Es un estado global oculto: quien lo usa depende de él sin decirlo, y las pruebas no pueden reemplazarlo. Es mejor pasar el objeto como parámetro (inyección de dependencias).
Método de fábrica 3 preguntas
¿Método de fábrica frente a un método de fábrica estático como List.of()?
El Método de fábrica del GoF es un método de instancia sobrescribible que cambian las subclases; un método de fábrica estático es un único método fijo que oculta el constructor.
¿Método de fábrica frente a Fábrica abstracta?
El Método de fábrica crea un producto mediante herencia; la Fábrica abstracta es un objeto que crea una familia completa de productos relacionados.
¿Qué principio SOLID lo respalda?
Abierto/cerrado: un canal nuevo es una subclase nueva, y el código existente de notify() no se edita.
Fábrica abstracta 3 preguntas
¿Cuál es el punto débil de la Fábrica abstracta?
Añadir un tipo de producto nuevo significa añadir un método a la interfaz y a cada fábrica.
¿Cómo eliges qué fábrica concreta usar?
Una vez, al arrancar (configuración o inyección de dependencias); el resto del código solo ve la interfaz.
¿Se puede construir una Fábrica abstracta a partir de Métodos de fábrica?
Sí: cada método create de la fábrica suele ser un método de fábrica que implementan las subclases.
Builder 3 preguntas
¿Por qué no usar simplemente setters?
Los setters dejan visible un objeto a medio construir y mutable; un builder entrega el objeto solo después de que build() lo haya validado.
¿Dónde validas en un Builder?
En build() para las reglas que involucran varios campos (un pedido necesita un artículo), y en el constructor compacto del record para las reglas que siempre se cumplen.
¿Builder frente a records con métodos `with`?
Los records son ideales para valores inmutables pequeños; un builder sigue siendo mejor cuando hay muchas partes opcionales o una construcción paso a paso.
Prototipo 3 preguntas
¿Copia superficial o copia profunda?
Una copia superficial comparte los objetos internos (la misma lista); una copia profunda también los copia, así que los cambios en la copia nunca llegan al original.
¿Por qué muchos equipos evitan Cloneable?
clone() omite los constructores, devuelve Object, lanza una excepción comprobada y por defecto copia de forma superficial; un copy() explícito o un constructor de copia es más claro.
¿Qué es un registro de prototipos?
Un mapa de objetos listos con nombre (plantillas) que los clientes copian en lugar de construirlos desde cero.
Adaptador 3 preguntas
¿Adaptador frente a Fachada?
El Adaptador hace que una interfaz encaje con otra que ya existe; la Fachada inventa una interfaz nueva y más simple sobre muchas clases.
¿Adaptador de objeto frente a adaptador de clase?
Un adaptador de objeto contiene el objeto antiguo (composición, la norma en Java); un adaptador de clase hereda de él, algo que Java solo permite con una clase.
¿Adaptador frente a Decorador?
El Adaptador cambia la interfaz y mantiene el comportamiento; el Decorador mantiene la interfaz y añade comportamiento.
Puente 3 preguntas
¿Cuántas clases necesitas para M tipos y N canales?
Con Bridge: M + N; con subclases para cada combinación M x N.
¿Bridge o Adapter?
Bridge se diseña desde el principio para que dos partes puedan evolucionar por separado; Adapter se añade después para que lo que ya existe encaje.
¿Bridge o Strategy?
El código se parece (un objeto guarda una interfaz); Bridge divide una estructura en dos a largo plazo, Strategy cambia un algoritmo.
Compuesto 3 preguntas
¿Dónde van los métodos para gestionar los hijos (add/remove)?
O solo en el grupo (con seguridad de tipos) o en la interfaz común (uniforme, pero las hojas deben rechazarlas); explica qué compromiso asumes.
¿Cómo ayuda una interfaz sealed a un Composite?
El compilador sabe que solo hay dos tipos, Product y Bundle, así que un switch sobre ellos se comprueba para ver si cubre todos los casos.
Nombra un riesgo de los composites muy anidados.
Profundidad de recursión y ciclos: un bundle que se contiene a sí mismo entra en un bucle infinito si no lo proteges.
Decorador 3 preguntas
¿Decorator o herencia?
La herencia fija los extras en tiempo de compilación; los decoradores los combinan en tiempo de ejecución sin crear clases nuevas.
¿Decorator o Proxy?
Misma estructura; un Decorator añade un comportamiento que pide quien llama, un Proxy controla el acceso (caché, carga diferida, seguridad) al mismo objeto.
¿Importa el orden de los decoradores?
Sí. Con un artículo de 1000 centavos en este kit: cupón y luego exprés = 1899, exprés y luego cupón = 1800 (ambos probados).
Fachada 3 preguntas
¿Una Facade impide que quien llama use los subsistemas?
No. Ofrece un camino sencillo; quien necesite más control puede seguir usando las partes directamente.
¿Facade o Mediator?
Facade va en un solo sentido: los clientes la llaman y ella llama a las partes. Mediator va en los dos sentidos: las partes se comunican entre sí a través de él.
¿Qué error evita la Facade de este kit?
Que un pago rechazado libere el stock reservado; el test comprueba que tras el rechazo quedan 1 lámpara.
Peso ligero 3 preguntas
¿Qué debe cumplir la parte compartida (intrínseca)?
Debe ser inmutable, porque todos ven el mismo objeto.
¿Por qué `Integer a = 127, b = 127; a == b` puede dar true, pero dar false con 128?
Integer.valueOf guarda en caché de -128 a 127 (un pool de flyweights), así que 127 es el mismo objeto; 128 es uno nuevo. Compara con equals().
¿Flyweight o Singleton?
Singleton es una única instancia de una clase; Flyweight es un pool de instancias compartidas, una por cada valor distinto.
Proxy 3 preguntas
Nombra cuatro tipos de proxy.
Virtual (creación diferida), remoto (representa un objeto en otro lugar), de protección (comprobación de accesos), de caché / referencia inteligente.
¿Cómo usa este patrón el @Transactional de Spring?
Spring envuelve el bean en un proxy que abre y confirma la transacción alrededor de la llamada al método real.
¿Por qué una autollamada se salta @Transactional?
this.method() llama directamente al objeto real, no al proxy, así que el trabajo extra del proxy nunca se ejecuta.
Cadena de responsabilidad 3 preguntas
¿Qué pasa si ningún manejador acepta la petición?
Debes decidir: un valor por defecto (aquí 'board review'), una excepción o un Optional vacío. Nunca falles en silencio.
¿Cadena o Decorator?
Un decorador siempre llama al objeto envuelto; un manejador de la cadena puede detener la petición y no pasarla al siguiente.
¿Cómo acorta Java 8+ las cadenas?
Los manejadores pueden ser lambdas que devuelven Optional, encadenados con un método default como then(), como en este kit.
Comando 3 preguntas
¿Cómo implementas deshacer con Command?
Apila cada comando ejecutado; deshacer saca el último y llama a su undo(), que restaura lo que modificó execute().
¿Command o Strategy?
Un Strategy es CÓMO hacer un trabajo (un orden de clasificación); un Command es una petición para hacer algo, a menudo con sus propios datos y su undo.
¿Por qué Clear guarda el texto anterior?
Borrar destruye información; deshacer necesita el valor 'anterior', así que el comando lo guarda (un pequeño memento).
Intérprete 3 preguntas
¿Qué son las expresiones terminales y no terminales?
Los terminales son hojas (números, nombres de variables); los no terminales combinan otras expresiones (Add, Mul).
¿Cómo acorta Java 21 un intérprete?
Una interfaz sealed de records para la gramática y un único switch con patrones de record para eval; el compilador comprueba que se cubren todos los casos.
¿Dónde se define la precedencia de operadores?
En la gramática del analizador: product se analiza dentro de sum, así que '2 + 3 * 4' se convierte en Add(2, Mul(3, 4)) = 14.
Iterador 3 preguntas
¿Qué es un iterador fail-fast?
El iterador de ArrayList lanza ConcurrentModificationException si la lista se modifica durante la iteración, salvo a través del propio iterador.
¿Qué debe hacer next() al final?
Lanzar NoSuchElementException, tal como indica el contrato de Iterator (probado en este kit).
¿Iteración interna o externa?
Externa: quien llama extrae los elementos con next(). Interna: la colección envía los elementos a tu lambda (forEach, streams).
Mediador 3 preguntas
¿Mediator o Observer?
Observer difunde los cambios de un sujeto a sus suscriptores; Mediator centraliza la comunicación bidireccional entre pares.
¿Cuál es el principal riesgo de un Mediator?
Toda la lógica de coordinación pasa a una sola clase, que puede volverse enorme; divídela por caso de uso.
Pon un ejemplo real de Mediator.
Una torre de control de un aeropuerto: los aviones se comunican con la torre, no entre ellos.
Memento 3 preguntas
¿Cuáles son los tres roles?
Originator (el carrito, crea y lee las instantáneas), Memento (la instantánea), Caretaker (el historial que solo las guarda).
¿Por qué la instantánea debe copiar la lista?
Si no, los cambios posteriores en el carrito también alterarían el estado 'guardado'; List.copyOf la hace inmutable (probado).
¿Memento o Command para deshacer?
Memento guarda estados completos (sencillo, más memoria); Command guarda cómo revertir cada cambio (menos memoria, más código).
Observador 3 preguntas
¿Qué fuga de memoria provoca Observer?
El sujeto mantiene referencias fuertes a los listeners; si nunca se dan de baja, el recolector de basura nunca puede liberarlos (listener olvidado).
¿Modelo push o pull?
Push envía los datos nuevos con el evento (aquí el Status); pull solo avisa de 'cambiado' y los listeners consultan al sujeto.
¿Por qué se declaró obsoleta java.util.Observable?
Es una clase, no una interfaz (hay que extenderla), no es serializable y sus eventos están poco definidos.
Estado 3 preguntas
¿State o Strategy?
Misma estructura; en State los estados se reemplazan unos a otros a medida que el objeto avanza; en Strategy quien llama elige el algoritmo.
¿Quién decide el siguiente estado?
Aquí cada estado devuelve el siguiente (New.pay() devuelve Paid). La otra opción es que decida el contexto; di cuál elegiste.
¿Por qué usar una interfaz sealed para los estados?
El compilador conoce todos los estados, así que un switch sobre ellos se comprueba y nadie puede añadir un estado fuera del archivo.
Estrategia 3 preguntas
¿Cómo cambian las lambdas a Strategy?
Una estrategia suele ser una interfaz funcional, así que cada algoritmo es una lambda de una línea en lugar de una clase.
¿Strategy o Método plantilla?
Strategy cambia un algoritmo completo por composición en tiempo de ejecución; Método plantilla fija los pasos y deja que las subclases completen algunos.
¿De dónde salen las estrategias en tiempo de ejecución?
Un mapa por nombre (como en este kit), una configuración o inyección de dependencias.
Método plantilla 3 preguntas
¿Por qué declarar final el método plantilla?
Para que ninguna subclase cambie el orden de los pasos; solo pueden completar los pasos que se les dan.
¿Qué es un hook?
Un paso opcional con un valor por defecto (aquí footer() devuelve "") que las subclases pueden sobrescribir.
¿Qué principio muestra Método plantilla?
El principio de Hollywood: no nos llames, nosotros te llamamos; la clase base llama a los pasos de la subclase.
Visitante 3 preguntas
¿Qué es el doble despacho?
El método que se ejecuta depende de dos tipos en tiempo de ejecución: item.accept(v) elige el tipo del elemento y luego v.visitBook(this) elige el visitor.
¿Qué cambia Java 21 en Visitor?
Con tipos sealed y pattern matching, un switch sobre el tipo del elemento se comprueba para ver si está completo, y a menudo sustituye a las clases visitor.
¿Cuándo no encaja bien Visitor?
Cuando añades tipos más a menudo que operaciones: cada tipo nuevo obliga a cambiar todos los visitors.
Gratis aquí, o llévate el kit completo
Gratis en esta página
Los 23 patrones: problema, idea, cuándo no usarlo y el olor de código que sustituye
El archivo Java completo de cada patrón y su salida real
Tabla de cuándo usar cada patrón y 69 preguntas de entrevista con respuestas
Kit completo · $19 pago único
Proyecto Maven (ZIP): 23 archivos de ejemplo + 23 clases de test JUnit (34 pruebas), run-all.sh / run-all.cmd, README
PDF de 30 páginas: tabla, una página por patrón con código y salida, hoja de repaso con respuestas, tabla de JDK
drills.csv para Anki o cualquier app de tarjetas de estudio
Reglas para Claude Code y Cursor que detectan dónde encaja un patrón en tu propio código
Java 21 o posterior. Todos los archivos se compilaron con -Xlint:all -Werror y se ejecutaron en JDK 21 y JDK 25 con la misma salida. run-all.sh te avisa si tu Java es más antiguo.
¿Necesito Maven?
No. run-all.sh / run-all.cmd compilan con javac y ejecutan los 23 ejemplos, y cualquier archivo suelto se ejecuta con java File.java. Maven solo sirve para los tests de JUnit (mvn test).
¿Qué IDE puedo usar?
Cualquiera: abre la carpeta como proyecto Maven en IntelliJ IDEA, Eclipse o VS Code; cada ejemplo tiene un método main.
¿Puedo usar el código en el trabajo?
Sí, cópialo en tus propios proyectos. Por favor, no revendas el kit en sí.
Más herramientas para desarrolladores y estudiantes
Patrones de diseño en Java: los 23 GoF con un archivo Java 21 corto, su salida real, guía de cuándo usar cada uno y 69 preguntas de entrevista.
¿Es gratis?
Sí. La versión gratuita de esta página funciona sin cuenta.
¿Cómo se usa?
1. Escriba sus datos en la versión gratuita de abajo. 2. Vea su resultado al momento en esta página. 3. ¿Necesita más? La versión completa añade lo que se indica en «Lo que obtiene».
Pregunta sobre esta herramienta
Una pregunta, respondida por quien la construyó. Email solo si quiere la respuesta por correo.
Para equipos y empresas: para una factura con los datos de su empresa, un presupuesto o varias licencias, escriba a support@getreadystack.com.