B3-T4: PATRONES DE DISEÑO (GoF), PRINCIPIOS SOLID Y ARQUITECTURA DE SOFTWARE

Tema clave y muy preguntado. Los patrones GoF más frecuentes en el examen son: Singleton, Factory Method, Abstract Factory, Observer, Strategy, Adapter, Decorator, Facade y MVC. SOLID es casi fijo. Memoriza qué tipo es cada patrón (creacional/estructural/comportamiento) y una descripción breve de cada uno — es lo que más preguntan.

PRINCIPIOS SOLID

Acuñados por Robert C. Martin ("Uncle Bob"). Son cinco principios de diseño orientado a objetos para crear software mantenible, extensible y robusto.

LetraPrincipioEnunciadoConsecuencia de violarlo
SSingle Responsibility (Responsabilidad única)Una clase debe tener una sola razón para cambiar (una sola responsabilidad)Clases "dios" que hacen demasiado, difíciles de mantener
OOpen/Closed (Abierto/Cerrado)Las entidades de software deben estar abiertas a la extensión pero cerradas a la modificaciónCada nuevo requisito obliga a modificar código existente (riesgo de regresión)
LLiskov Substitution (Sustitución de Liskov)Los objetos de una subclase deben poder sustituir a los de la clase base sin alterar el comportamiento correctoSubclases que rompen el contrato de la clase base (ej: cuadrado que hereda de rectángulo)
IInterface Segregation (Segregación de interfaces)Los clientes no deben depender de interfaces que no usan. Mejor muchas interfaces específicas que una generalInterfaces "gordas" que obligan a implementar métodos innecesarios
DDependency Inversion (Inversión de dependencias)Los módulos de alto nivel no deben depender de los de bajo nivel. Ambos deben depender de abstraccionesAcoplamiento fuerte entre capas, difícil de testear y cambiar
Examen: El principio de Liskov es de Barbara Liskov (1987). El principio Open/Closed fue enunciado originalmente por Bertrand Meyer (1988). La inversión de dependencias se implementa con inyección de dependencias (DI) y contenedores IoC.

OTROS PRINCIPIOS DE DISEÑO

PrincipioDescripción
DRY (Don't Repeat Yourself)Cada pieza de conocimiento debe tener una representación única y no ambigua en el sistema
KISS (Keep It Simple, Stupid)Mantener el diseño lo más simple posible
YAGNI (You Aren't Gonna Need It)No implementar funcionalidad hasta que sea necesaria (principio de XP)
Alta cohesiónLos elementos de un módulo deben estar estrechamente relacionados entre sí
Bajo acoplamientoLos módulos deben tener la mínima dependencia posible entre sí
Composición sobre herenciaPreferir componer objetos que heredar de clases base (GoF lo recomienda explícitamente)
Ley de DemeterUn objeto solo debe hablar con sus colaboradores inmediatos (no con los amigos de los amigos)
Separación de concernsCada módulo/capa debe abordar un aspecto distinto del problema

PATRONES DE DISEÑO GoF

Los 23 patrones de diseño fueron catalogados por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides en su libro "Design Patterns: Elements of Reusable Object-Oriented Software" (1994), conocidos como la Gang of Four (GoF).

Clasificación

CategoríaPropósitoPatrones (5 + 7 + 11 = 23)
Creacionales (5)Cómo se crean los objetosAbstract Factory, Builder, Factory Method, Prototype, Singleton
Estructurales (7)Cómo se componen clases y objetosAdapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
De comportamiento (11)Cómo interactúan y se reparten responsabilidadesChain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor

PATRONES CREACIONALES

PatrónIntenciónCuándo usarloEjemplo real
SingletonGarantizar que una clase tenga exactamente una instancia y proporcionar un punto de acceso globalConexión a BBDD, logger, configuración global, pool de recursosRuntime.getRuntime() en Java
Factory MethodDefinir una interfaz para crear objetos, dejando que las subclases decidan qué clase instanciarFrameworks que crean objetos sin conocer la clase concretaCollection.iterator()
Abstract FactoryProporcionar una interfaz para crear familias de objetos relacionados sin especificar clases concretasKits de UI multiplataforma (botones, ventanas para Windows/Mac/Linux)GUI toolkits, drivers de BBDD
BuilderSeparar la construcción de un objeto complejo de su representaciónObjetos con muchos parámetros opcionales, construcción paso a pasoStringBuilder, fluent APIs
PrototypeCrear objetos nuevos clonando un prototipo existenteCuando crear un objeto desde cero es costoso pero copiarlo es eficienteObject.clone() en Java
Examen: Singleton es el más preguntado. Cuidado: Singleton dificulta los tests unitarios (estado global). Factory Method usa herencia (subclases deciden). Abstract Factory usa composición (familias de productos). La diferencia es sutil pero cae.

PATRONES ESTRUCTURALES

PatrónIntenciónCuándo usarloEjemplo real
AdapterConvertir la interfaz de una clase en otra que el cliente espera. Permite que clases incompatibles trabajen juntasIntegrar código legacy o librerías de terceros con interfaz diferenteArrays.asList(), adaptadores de enchufes
BridgeDesacoplar una abstracción de su implementación para que varíen independientementeCuando tanto la abstracción como la implementación pueden cambiarDrivers de dispositivos, renderizadores multiplataforma
CompositeComponer objetos en estructuras de árbol para representar jerarquías parte-todo. Tratar objetos individuales y compuestos de forma uniformeEstructuras recursivas: menús, sistema de ficheros, UIDOM, sistema de archivos
DecoratorAñadir responsabilidades dinámicamente a un objeto envolviéndolo, sin modificar su claseAlternativa flexible a la herencia para extender funcionalidadBufferedReader(new FileReader()), middleware
FacadeProporcionar una interfaz simplificada a un subsistema complejoSimplificar el uso de una API compleja o un conjunto de clasesAPIs de alto nivel, wrappers de librerías
FlyweightCompartir objetos para soportar gran cantidad de objetos de grano fino eficientementeMiles de objetos similares con datos compartidosPool de caracteres, caché de objetos inmutables
ProxyProporcionar un sustituto o representante de otro objeto para controlar el accesoLazy loading, control de acceso, logging, cachéProxies de red (RMI), lazy loading en JPA/Hibernate
Examen: Adapter cambia la interfaz (hace compatible lo incompatible). Decorator añade funcionalidad (misma interfaz, más comportamiento). Proxy controla el acceso (misma interfaz, controla cuándo/cómo se accede). Facade simplifica (interfaz más simple sobre algo complejo). Composite = estructuras de árbol.

PATRONES DE COMPORTAMIENTO

PatrónIntenciónCuándo usarloEjemplo real
ObserverDefinir dependencia uno-a-muchos: cuando un objeto cambia de estado, todos sus dependientes son notificadosEventos, suscripciones, reactive programmingEvent listeners (DOM), MVC (modelo notifica a vistas)
StrategyDefinir una familia de algoritmos, encapsular cada uno, y hacerlos intercambiablesMúltiples algoritmos para la misma tarea (ordenación, validación, cálculo de precios)Comparator en Java, estrategias de autenticación
Template MethodDefinir el esqueleto de un algoritmo en la clase base; las subclases implementan los pasos específicosAlgoritmos con estructura fija pero pasos variablesHttpServlet.doGet(), frameworks con hooks
CommandEncapsular una solicitud como un objeto (parametrizar, encolar, deshacer)Undo/redo, colas de comandos, operaciones diferidasAcciones de menú, transacciones, colas de tareas
IteratorProporcionar un modo de acceder secuencialmente a los elementos de una colección sin exponer su estructura internaRecorrer colecciones de forma uniformeIterator en Java, for...of en JS
StatePermitir que un objeto altere su comportamiento cuando cambia su estado interno (parece que cambia de clase)Máquinas de estado, objetos con comportamiento dependiente del estadoConexión TCP (LISTEN, ESTABLISHED, CLOSED)
Chain of ResponsibilityPasar una petición por una cadena de manejadores; cada uno decide si la procesa o la pasa al siguienteMiddleware, filtros, validadores en cadenaMiddleware de Express/Koa, filtros de servlet
MediatorDefinir un objeto que encapsule cómo interactúan un conjunto de objetos (reduce acoplamiento directo)Muchos objetos que se comunican entre sí (chat, UI compleja)Controladores de tráfico aéreo, salas de chat
MementoCapturar y almacenar el estado interno de un objeto para poder restaurarlo posteriormenteUndo/redo, snapshots, puntos de restauraciónSerialización de estado, ctrl+Z
VisitorRepresentar una operación sobre los elementos de una estructura de objetos. Permite definir nuevas operaciones sin cambiar las clasesOperaciones sobre estructuras heterogéneas (árboles AST, DOM)Compiladores (visitor sobre AST), exportadores
InterpreterDefinir una gramática para un lenguaje simple y un intérprete para evaluar sentenciasLenguajes de dominio específico (DSL), expresiones regulares, calculadorasEvaluadores de expresiones, parsers simples
Examen: Observer = notificación de cambios (pub/sub). Strategy = algoritmos intercambiables (composición). Template Method = esqueleto fijo, pasos variables (herencia). State vs Strategy: State cambia de comportamiento automáticamente con el estado; Strategy es elegido externamente. Command = acción como objeto (para undo, colas).

PATRONES ARQUITECTÓNICOS

MVC, MVP y MVVM

PatrónComponentesFlujo de datosUso típico
MVC (Model-View-Controller)Model: datos y lógica de negocio. View: presentación. Controller: gestiona la entrada del usuario y actualiza modelo/vistaUsuario → Controller → Model → ViewAplicaciones web server-side (Spring MVC, Rails, Django)
MVP (Model-View-Presenter)Model: datos. View: interfaz (pasiva). Presenter: toda la lógica de presentación, manipula View directamenteView ↔ Presenter ↔ Model. View es pasivaAndroid (legacy), aplicaciones de escritorio
MVVM (Model-View-ViewModel)Model: datos. View: UI declarativa. ViewModel: expone datos y comandos, la View se enlaza (binding) al ViewModelView ← (binding) → ViewModel ↔ ModelWPF, Angular, Vue, SwiftUI, Android Jetpack

Arquitecturas por capas

CapaResponsabilidadTecnología ejemplo
PresentaciónInterfaz de usuario, interacciónHTML/CSS/JS, React, Angular, WPF
Lógica de negocioReglas de negocio, procesamientoSpring, EJB, .NET Core, Django
Acceso a datosPersistencia, ORM, consultas a BBDDJPA/Hibernate, Entity Framework, SQLAlchemy
Base de datosAlmacenamiento persistentePostgreSQL, Oracle, MongoDB

Otros patrones arquitectónicos

PatrónDescripciónVentajaDesventaja
MonolitoToda la aplicación en un solo desplegableSimple de desarrollar/desplegar/debugar inicialmenteDifícil de escalar, cambios afectan a todo
MicroserviciosAplicación como conjunto de servicios pequeños e independientes, cada uno con su BBDDEscalabilidad independiente, despliegue independiente, equipos autónomosComplejidad operacional, transacciones distribuidas, latencia de red
SOA (Service-Oriented Architecture)Servicios reutilizables comunicados por ESB (Enterprise Service Bus)Reutilización, interoperabilidadESB como cuello de botella, complejidad
Event-DrivenComponentes se comunican mediante eventos asíncronosDesacoplamiento, escalabilidadDifícil de debugar, eventual consistency
Hexagonal (Ports & Adapters)El núcleo de negocio no depende de infraestructura; se conecta mediante puertos e adaptadoresTestabilidad, independencia de frameworksMás clases y capas de abstracción
CQRS (Command Query Responsibility Segregation)Separa el modelo de escritura (commands) del de lectura (queries)Optimizar lectura y escritura por separadoComplejidad, sincronización
Examen: MVC es el más preguntado — saber quién conoce a quién (Model no conoce a View directamente, Controller conoce a ambos). Microservicios vs SOA: microservicios no usan ESB centralizado (smart endpoints, dumb pipes). SOA usa ESB con lógica de routing.

PATRONES DE DISEÑO EMPRESARIALES

PatrónDescripciónUso
RepositoryAbstrae el acceso a datos detrás de una interfaz tipo colecciónDesacoplar lógica de negocio de la persistencia
DAO (Data Access Object)Encapsula las operaciones CRUD de una entidad específicaCapa de acceso a datos en Java EE
DTO (Data Transfer Object)Objeto que transporta datos entre capas/procesos sin lógicaReducir llamadas remotas, serialización
Service LayerCapa que expone la lógica de negocio como serviciosInterfaz entre presentación y dominio
Unit of WorkMantiene lista de objetos modificados en una transacción y coordina la escrituraORM (Entity Framework, Hibernate Session)
Dependency Injection (DI)Las dependencias se proporcionan externamente (constructor, setter, interfaz)Implementar Inversión de Dependencias (SOLID D). Spring, .NET DI
IoC ContainerContenedor que gestiona el ciclo de vida y las dependencias de los objetosSpring ApplicationContext, .NET ServiceProvider


FUENTES PÚBLICAS

Este resumen ha sido elaborado íntegramente a partir de fuentes de dominio público. No se ha utilizado material con copyright de terceros ni material de preparadores.
FuenteTipoReferencia
Gamma, Helm, Johnson, Vlissides (1994) — "Design Patterns" (GoF)Conocimiento públicoNombres y conceptos de patrones son de dominio público
Martin, R. C. — Principios SOLIDPublicaciones públicascleancoders.com, publicaciones técnicas
Fowler, M. — Patterns of Enterprise Application ArchitectureConocimiento públicoConceptos de patrones empresariales
Documentación de Spring FrameworkDocumentación oficialspring.io/docs (Apache 2.0)

¿Quieres practicar este tema con tests?

MIMIR tiene más de 5.000 preguntas verificadas, simulacros con penalización real y chat IA que resuelve tus dudas sobre este tema.

Abrir MIMIR gratis →