Grado en Ingeniería Electrónica Industrial y Automática · ETSIDI · UPM

Sistemas Informáticos
Industriales

C++ UML CMake 6 CAPÍTULOS 17 PATRONES GoF CC BY-NC-SA 4.0
Prof. Carlos Platero Dueñas
Dep. Ingeniería Eléctrica,
Electrónica, Automática
y Física Aplicada

blogs.upm.es/carlos-platero

Material completo del curso de Sistemas Informáticos Industriales del Grado en Ingeniería Electrónica Industrial y Automática (ETSIDI-UPM), publicado en acceso abierto.

El curso cubre el desarrollo de software orientado a objetos aplicado a sistemas industriales: desde la captura de requisitos y el análisis con UML hasta el diseño con patrones de diseño GoF (Gang of Four). Cada patrón incluye una implementación completa en C++ con su CMakeLists.txt, lista para compilar.

El material teórico corresponde al libro "Apuntes de Informática Industrial: análisis y diseño orientado a objetos" (Fundación General UPM, 2007, ISBN 978-84-96737-15-0). Licencia: CC BY-NC-SA 4.0.

6
Capítulos teoría
17
Patrones GoF
C++
Lenguaje
Acceso libre
Apuntes por capítulos
CAPÍTULO 01
Introducción a la Ingeniería de la Programación
Crisis del software. Proceso Unificado (UP). Ciclo de vida iterativo e incremental. Roles, artefactos y flujos de trabajo. Introducción a UML.
CAPÍTULO 02
Recogida y documento de requisitos
Fase de inicio del Proceso Unificado. Casos de uso. Actores. Relaciones entre casos de uso. Documento de visión. Modelo de negocio.
CAPÍTULO 03
Análisis orientado a objetos
Fase de elaboración. Diagramas de secuencia y colaboración. Identificación de clases de análisis: entidad, control y frontera. Contratos de operación.
CAPÍTULO 04
UML estructural
Diagrama de clases. Relaciones: asociación, agregación, composición, herencia y dependencia. Multiplicidades. Interfaces. Diagramas de componentes y despliegue.
CAPÍTULO 05
UML dinámico y de implementación
Diagramas de estado, actividad y tiempo. Diagramas de interacción: secuencia y comunicación. Máquinas de estado de Harel. Paso de análisis a implementación en C++.
CAPÍTULO 06
Diseño orientado a objetos y patrones GoF
Principios SOLID. Patrones de diseño GoF (Gamma, Helm, Johnson, Vlissides). Patrones creacionales, estructurales y de comportamiento. Arquitectura por capas y eventos.
Ejemplos de código C++ con CMake

Cada patrón incluye un ZIP con el código fuente en C++ y su CMakeLists.txt listo para compilar con CMake. Para compilar: mkdir build && cd build && cmake .. && make

Creacionales Controlan la creación de objetos
CREACIONAL
Singleton
Garantiza que una clase tiene una única instancia y proporciona un punto de acceso global a ella. Útil para gestores de recursos compartidos (configuración, logs, conexiones).
Ejemplo: clase GlobalClass con valor compartido accesible desde cualquier módulo.
CREACIONAL
Factory Method (Factoría)
Define una interfaz para crear objetos pero delega en las subclases la decisión de qué clase instanciar. Desacopla el código cliente de las clases concretas.
Ejemplo: Factoria de piezas de ajedrez (Rey, Peón) — la factoría decide qué tipo de pieza crear según el color y tipo solicitado.
CREACIONAL
Factory Method — Transporte
Variante del Factory Method aplicada a la selección dinámica de medio de transporte al aeropuerto según número de pasajeros y criterios de coste/tiempo.
Ejemplo: Transporte::crearTransporte() devuelve Bus, Tren o Taxi según el tipo solicitado. Aplicación real de decisión de transporte óptimo.
CREACIONAL
Factory Method — Clasificador
Factoría que instancia el clasificador adecuado (kNN, Bayes, RandomForest) en función de los datos de entrenamiento, desacoplando el cliente del algoritmo concreto.
Ejemplo: Factoria de clasificadores con base de entrenamiento. Aplicación en reconocimiento de patrones e inteligencia artificial.
Estructurales Composición de clases y objetos
ESTRUCTURAL
Adapter — Robots
Convierte la interfaz de una clase en otra que el cliente espera. Permite que clases con interfaces incompatibles trabajen juntas sin modificar su código.
Ejemplo: adaptador entre RobotWizo (Bluetooth/mover) y RobotDico (WiFi/go) mediante interfaz común IRobot. Caso realista de integración de robots heterogéneos.
ESTRUCTURAL
Adapter — Impresora
Segunda variante del Adapter: adapta una impresora antigua (OldPrinter) a la interfaz moderna (Printer) usando composición. Combina con Singleton en la Factoría.
Ejemplo: PrinterAdapter envuelve OldPrinter para hacerla compatible con el sistema moderno, sin modificar el código heredado (legacy).
ESTRUCTURAL
Bridge (Puente)
Desacopla una abstracción de su implementación para que ambas puedan variar independientemente. Evita la explosión de subclases al combinar jerarquías ortogonales.
Ejemplo: Circulo (abstracción) desacoplado de DibujandoAPI1/API2 (implementación). La forma puede cambiar de API de renderizado sin modificar su lógica.
ESTRUCTURAL
Composite
Compone objetos en estructuras de árbol para representar jerarquías parte-todo. Permite tratar objetos individuales y composiciones de forma uniforme.
Ejemplo: estructura de árbol con Component y Composite. Cada nodo puede contener otros nodos, modelando sistemas de ficheros, menús o estructuras organizativas.
ESTRUCTURAL
Decorator (Decorador)
Añade responsabilidades adicionales a un objeto dinámicamente. Alternativa flexible a la herencia para extender funcionalidad sin modificar la clase base.
Ejemplo: SeatLeon decorado con opciones (GPS, techo solar, pintura metalizada) mediante composición. Calcula precio y descripción acumulando decoradores.
ESTRUCTURAL
Clases Internas (Inner Classes)
Técnica C++ de clase interna privada que implementa una interfaz pública, exponiendo solo la funcionalidad deseada. Permite conversiones de tipo controladas mediante operator.
Ejemplo: NumeroReal con clase interna NotificadorEntero que implementa IEntero. Conversión implícita de float a int con encapsulamiento total.
Comportamiento Comunicación y responsabilidad entre objetos
COMPORTAMIENTO
Observer (Observador) — Divisor
Define dependencia uno-a-muchos entre objetos: cuando el sujeto cambia de estado, notifica automáticamente a todos sus observadores. Base del paradigma reactivo.
Ejemplo: Subject con valor entero notifica a múltiples Observer, cada uno con un divisor distinto. Muestra qué observadores son divisores del valor actual.
COMPORTAMIENTO
Strategy (Estrategia)
Define una familia de algoritmos, encapsula cada uno y los hace intercambiables. Permite que el algoritmo varíe independientemente de los clientes que lo usan.
Ejemplo: GestorCompras con distintas estrategias de cálculo de precio (ordinario, descuento por volumen, IVA reducido), seleccionadas en tiempo de ejecución por la Factoría.
COMPORTAMIENTO
State (Máquina de Estado)
Permite que un objeto altere su comportamiento cuando su estado interno cambia. El objeto parecerá cambiar de clase. Implementa máquinas de estado finitas de forma limpia.
Ejemplo: MaquinaEstado con pistón (PistonArriba/Abajo). Las transiciones de estado se gestionan mediante polimorfismo, sin condicionales anidados.
COMPORTAMIENTO
Template Method
Define el esqueleto de un algoritmo en una clase base, delegando algunos pasos a las subclases. Permite redefinir ciertos pasos sin cambiar la estructura del algoritmo.
Ejemplo: preparación de bebida — Bebida define la secuencia (hervir, elaborar, verter, condimentos). Cafe y Te implementan los pasos específicos de cada bebida.
COMPORTAMIENTO
Chain of Responsibility (Cadena de Responsabilidad)
Pasa una petición a través de una cadena de manejadores. Cada manejador decide procesar la petición o pasarla al siguiente. Desacopla emisor y receptor.
Ejemplo: cadena de atención al cliente — CentralitaHandler → TecnicoHandler → DirectorHandler. Cada nivel resuelve lo que puede y escala el resto. Incluye versiones v0 y vB de la implementación.
COMPORTAMIENTO
Mediator (Mediador)
Define un objeto que encapsula cómo interactúan otros objetos. Promueve el bajo acoplamiento evitando que los objetos se referencien entre sí directamente.
Ejemplo: sala de chat donde los User no se comunican directamente sino a través de un ChatMediator. Modela sistemas de mensajería, salas de control y redes de sensores.
Arquitectura Patrones de arquitectura software
ARQUITECTURA
Observer con arquitectura por eventos
Implementación completa del patrón Observer con interfaces Observable y Observer en ficheros de cabecera separados. Modela una arquitectura reactiva basada en eventos para sistemas de control.
Ejemplo: SensorControl que notifica cambios de estado a múltiples observadores mediante clase interna Notifier. Incluye Observer.h y Observable.h reutilizables.