Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Programación Orientada a Objetos

Parte 4: Patrones de Diseño

Soluciones Probadas a Problemas Recurrentes

Universidad Nacional de Rio Negro - Sede Andina

En los capítulos anteriores dominamos los fundamentos de OOP (Fundamentos de la Programación Orientada a Objetos), las relaciones entre objetos (Encapsulamiento y Relaciones entre Objetos), herencia y polimorfismo (Herencia y Polimorfismo Conceptual y Herencia y Polimorfismo en Java), y el diseño por contratos (Diseño por Contratos).

Ahora aplicamos todo ese conocimiento en patrones de diseño: soluciones elegantes y probadas a problemas que aparecen una y otra vez en el desarrollo de software.


Esta portada funciona como mapa general. Para entrar a cada familia y navegar sus patrones individuales:

FamiliaEnlaceQué vas a encontrar
CreacionalesIr al índice creacionalSingleton, Factory, Abstract Factory, Builder y Prototype
EstructuralesIr al índice estructuralAdapter, Bridge, Composite, Decorator, Facade, Flyweight y Proxy
ComportamientoIr al índice de comportamientoStrategy, Observer, Command, State, Template Method y otros

Práctica de cursada

Parte 4 ya funciona como referencia. Para usarla como tramo de cursada, conviene trabajarla así:

EscalaQué hacer
Patrón individualLeer el contexto, contrastar cuándo aplica / cuándo no aplica y resolver el mini ejercicio del final
Familia creacionalCerrar con ejercicios integradores de creacionales
Familia estructuralCerrar con ejercicios integradores de estructurales
Familia de comportamientoCerrar con ejercicios integradores de comportamiento

Orden sugerido de lectura

OrdenPáginaRol en el recorrido
0Esta portadaMapa general de la parte y criterios de uso
1Familia CreacionalComparar estrategias de creación
2Singleton, Factory Method, Abstract Factory, Builder, PrototypeRecorrer los patrones creacionales
3Ejercicios integradores de patrones creacionalesCerrar la familia con práctica comparativa
4Familia EstructuralEntender composición, adaptación y desacoplamiento
5Adapter, Bridge, Composite, Decorator, Facade, Flyweight, ProxyRecorrer los patrones estructurales
6Ejercicios integradores de patrones estructuralesCerrar la familia con decisiones de arquitectura
7Familia de ComportamientoOrdenar responsabilidades, algoritmos e interacciones
8Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, VisitorRecorrer los patrones de comportamiento
9Ejercicios integradores de patrones de comportamientoCerrar la familia con comparación entre patrones

Capítulos nucleares

Estos capítulos conviene dominarlos sí o sí para construir un criterio de diseño reutilizable:

CapítuloPor qué es nuclear
Factory MethodFija la lógica de desacoplar creación y uso
BuilderIntroduce construcción paso a paso y objetos complejos
AdapterInstala el problema de compatibilidad entre interfaces
DecoratorMuestra cómo extender comportamiento sin herencia explosiva
StrategyFija la idea de algoritmos intercambiables
ObserverIntroduce coordinación entre objetos con bajo acoplamiento

Repaso y ampliación

Estas páginas cumplen mejor un rol de navegación, consolidación o profundización:

PáginaTipoUso sugerido
Familia CreacionalÍndice de familiaUsar como mapa comparativo antes o después de los patrones individuales
Familia EstructuralÍndice de familiaReleer al decidir entre composición, adaptación y control de acceso
Familia de ComportamientoÍndice de familiaUsar como tabla de decisión para algoritmos, estados e interacciones
SingletonProfundizaciónRevisar con cautela por sus trade-offs de diseño
Abstract FactoryProfundizaciónReleer cuando haga falta coherencia entre familias de objetos
PrototypeProfundizaciónVolver cuando el costo de creación o clonado sea central
BridgeProfundizaciónReleer si aparecen jerarquías combinatorias
CompositeProfundizaciónReleer frente a árboles o estructuras recursivas
Facade, Flyweight, ProxyAmpliaciónConsultar según problemas concretos de simplificación, memoria o acceso
Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, State, Template Method, VisitorAmpliaciónConsultar según el problema dominante de control de flujo o interacción
Ejercicios integradores creacionales, estructurales y de comportamientoConsolidaciónUsar para cerrar cada familia con comparación y justificación

Índice exhaustivo

Creacionales

Estructurales

Comportamiento


¿Qué son los Patrones de Diseño?

Definición

Un patrón de diseño es una solución general y reutilizable a un problema común en el diseño de software. No es código listo para usar, sino una plantilla o receta que describe cómo resolver un problema en diferentes contextos.

Los patrones de diseño, establecen un lenguaje, y aunque no se utilice exactamente como se lo describe aquí, facilita la comunicación entre desarrolladores, introduciendo conceptos reutilizables de alto nivel.

Origen e Historia

Los patrones de diseño en software se popularizaron con el libro de los “Gang of Four” (GoF) en 1994:

Documentaron 23 patrones clasificados en tres categorías:

CategoríaPropósitoEjemplos
CreacionalesCómo crear objetosFactory, Singleton, Builder
EstructuralesCómo componer objetosAdapter, Decorator, Composite
ComportamientoCómo interactúan objetosStrategy, Observer, Template

Anatomía de un Patrón

Cada patrón se describe con:

  1. Nombre: Identificador conciso y memorable

  2. Problema: Cuándo aplicar el patrón

  3. Solución: Estructura de clases y objetos

  4. Consecuencias: Trade-offs y resultados

Beneficios

  1. Vocabulario común: “Usemos un Observer aquí” es más claro que explicar toda la estructura

  2. Soluciones probadas: No reinventar la rueda

  3. Diseños flexibles: Anticipan cambios futuros

  4. Documentación implícita: El nombre del patrón comunica la intención


Patrones Creacionales

Los patrones creacionales abstraen el proceso de instanciación de objetos, haciendo el sistema independiente de cómo se crean, componen y representan los objetos.

Para un análisis profundo de patrones creacionales, incluidos Singleton, Factory Method, Abstract Factory, Builder y Prototype, consultá la sección dedicada: índice de patrones creacionales.

Resumen Rápido

PatrónPropósitoEjemplo
Factory MethodDelega creación a subclasesSistema de transporte
Abstract FactoryCrea familias de objetosUI multiplataforma
SingletonGarantiza una única instanciaLogger, Configuración
BuilderConstruye objetos complejos paso a pasoConstructor de pizzas
PrototypeClona objetos existentesClonar documentos

Patrones Estructurales

Los patrones estructurales se ocupan de cómo se componen las clases y objetos para formar estructuras más grandes, facilitando la comunicación entre entidades.

Para un análisis profundo de patrones estructurales, incluidos Adapter, Bridge, Composite, Decorator, Facade, Flyweight y Proxy, consultá la sección dedicada: índice de patrones estructurales.

Resumen Rápido

PatrónPropósitoEjemplo
AdapterConvierte interfaz incompatibleIntegración con sistemas legacy
BridgeDesacopla abstracción de implementaciónMúltiples drivers
CompositeEstructura jerárquica uniformeSistema de archivos, UI
DecoratorAgrega responsabilidades dinámicamenteJava I/O, coffee shop
FacadeInterfaz simplificada a subsistemaAPI unificada
FlyweightComparte objetos para optimizarCache, pool de objetos
ProxyControla acceso a otro objetoLazy loading, logging

Patrones de Comportamiento

Los patrones de comportamiento se ocupan de algoritmos y la asignación de responsabilidades entre objetos.

Para un análisis profundo de patrones de comportamiento, incluidos Strategy, Observer, Template Method, State, Command y otros, consultá la sección dedicada: índice de patrones de comportamiento.

Resumen Rápido

PatrónPropósitoEjemplo
StrategyEncapsula algoritmos intercambiablesMúltiples formas de ordenamiento
ObserverNotifica cambios a múltiples objetosSuscripciones, eventos
Template MethodDefine esqueleto reutilizableProcesamiento de datos
StateCambia comportamiento según estadoMáquina de estados
CommandEncapsula solicitudes como objetosUndo/Redo
IteratorAccede elementos secuencialmenteRecorrido de colecciones
MediatorCentraliza comunicaciónChat, panel de control
Chain of ResponsibilityPasa solicitudes en cadenaManejo de excepciones

¿Cuándo Usar (y No Usar) Patrones?

Señales de que Necesitás un Patrón

ProblemaPatrón Sugerido
“Tengo muchos if/else para crear objetos”Factory
“Necesito una sola instancia global”Singleton (con cuidado)
“El constructor tiene demasiados parámetros”Builder
“Necesito adaptar una interfaz incompatible”Adapter
“Quiero agregar funcionalidad dinámicamente”Decorator
“Tengo estructura de árbol/jerarquía”Composite
“Tengo múltiples algoritmos intercambiables”Strategy
“Objetos deben reaccionar a cambios de otro”Observer
“Tengo un algoritmo con pasos variables”Template Method

Señales de que NO Necesitás un Patrón


Ejemplo: Combinando Patrones

Un sistema real suele combinar varios patrones:

// FACTORY: crea procesadores según el tipo
ProcesadorFactory factory = new ProcesadorFactory();
Procesador proc = factory.crear(tipoArchivo);

// STRATEGY: diferentes algoritmos de compresión
proc.setCompresion(new CompresionZIP());

// DECORATOR: agrega funcionalidades
proc = new ProcesadorConLog(proc);
proc = new ProcesadorConCache(proc);

// OBSERVER: notifica progreso
proc.agregarObservador(new BarraProgreso());
proc.agregarObservador(new Logger());

// TEMPLATE METHOD (interno al procesador)
proc.procesar(archivo);

Resumen

Patrones Creacionales

PatrónPropósito
FactoryCrear objetos sin especificar clases concretas
Abstract FactoryCrear familias de objetos relacionados
SingletonGarantizar una única instancia
BuilderConstruir objetos complejos paso a paso

Patrones Estructurales

PatrónPropósito
AdapterConvertir interfaz incompatible
DecoratorAgregar responsabilidades dinámicamente
CompositeTratar objetos y composiciones uniformemente

Patrones de Comportamiento

PatrónPropósito
StrategyEncapsular algoritmos intercambiables
ObserverNotificar cambios a múltiples objetos
Template MethodDefinir esqueleto de algoritmo

Principios Clave

  1. Identificá el problema primero: No busques patrones, buscá soluciones

  2. Preferí composición sobre herencia: Más flexible

  3. Programá hacia interfaces: Más desacoplado

  4. Evitá la complejidad innecesaria: YAGNI (You Aren’t Gonna Need It)

Próximo paso

Para seguir, conviene entrar a una familia concreta de patrones: creacionales, estructurales o de comportamiento.