Menu
CoddyTech

Introducción a los patrones de diseño

Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 90 de 104.

Los patrones de diseño son soluciones probadas y reutilizables para problemas comunes que surgen en el diseño de software. No son código que se copia directamente: son plantillas o planos que describen cómo estructurar clases y objetos para resolver desafíos específicos de forma elegante.

El concepto fue popularizado por la «Banda de los Cuatro» (GoF) en su libro de 1994, que catalogó 23 patrones fundamentales. Estos patrones suelen agruparse en tres categorías:

Categoría Propósito Ejemplos
Creacionales Mecanismos de creación de objetos Singleton, Factory, Builder
Estructurales Composición de clases y objetos Adapter, Decorator, Composite
De comportamiento Interacción y responsabilidad de los objetos Observer, Strategy, Command

¿Por qué aprender patrones de diseño? Proporcionan un vocabulario compartido entre los desarrolladores: decir «usa una fábrica aquí» comunica al instante una idea compleja. También te ayudan a evitar reinventar soluciones y hacen que tu código sea más flexible y fácil de mantener.

En C++, los patrones de diseño aprovechan las características de la programación orientada a objetos que ya has aprendido: herencia, polimorfismo, clases abstractas y plantillas. En las próximas lecciones, implementarás varios patrones esenciales y entenderás cuándo cada uno es la herramienta adecuada para cada tarea.

challenge icon

Desafío

Fácil

Vamos a crear un clasificador de patrones sencillo que demuestre que comprendes las tres categorías de patrones de diseño. Crearás un sistema que recibe el nombre de un patrón e identifica a qué categoría pertenece: Creational, Structural o Behavioral, junto con una breve descripción del propósito de esa categoría.

Organizarás el código en tres archivos:

  • PatternCategory.h: Define una clase base abstracta llamada PatternCategory que representa una categoría de patrones de diseño. Debe tener:
    • Un método virtual puro getName() que devuelve el nombre de la categoría como una cadena
    • Un método virtual puro getPurpose() que devuelve una descripción de lo que hacen los patrones de esta categoría
    • Un destructor virtual

    Después, crea tres clases derivadas que hereden de PatternCategory:

    • CreationalCategory: devuelve el nombre "Creational" y el propósito "Object creation mechanisms"
    • StructuralCategory: devuelve el nombre "Structural" y el propósito "Class and object composition"
    • BehavioralCategory: devuelve el nombre "Behavioral" y el propósito "Object interaction and responsibility"
  • PatternClassifier.h: Crea una clase PatternClassifier que pueda identificar a qué categoría pertenece un patrón dado.

    Tu clasificador debe tener un método classify que reciba el nombre de un patrón (cadena) y devuelva un puntero a la PatternCategory correspondiente. Usa punteros inteligentes (std::unique_ptr) para la gestión de memoria.

    El clasificador debe reconocer estos patrones:

    • Creational: Singleton, Factory, Builder
    • Structural: Adapter, Decorator, Composite
    • Behavioral: Observer, Strategy, Command

    Si no se reconoce el nombre del patrón, devuelve nullptr.

  • main.cpp: Lee una única entrada: el nombre de un patrón de diseño.

    Crea un PatternClassifier y úsalo para clasificar el patrón de entrada. Si se reconoce el patrón, imprime:

    [PatternName] is a [CategoryName] pattern
    Purpose: [CategoryPurpose]

    Si no se reconoce el patrón, imprime:

    Unknown pattern: [PatternName]

Por ejemplo, con la entrada Singleton:

Singleton is a Creational pattern
Purpose: Object creation mechanisms

Con la entrada Observer:

Observer is a Behavioral pattern
Purpose: Object interaction and responsibility

Con la entrada Proxy:

Unknown pattern: Proxy

Este desafío refuerza las tres categorías de patrones de diseño mientras practicas la herencia, el polimorfismo y los punteros inteligentes: conceptos que ya dominas. La estructura de varios archivos refleja cómo los proyectos reales organizan clases relacionadas.

Pruébalo tú mismo

#include <iostream>
#include <string>
#include "PatternClassifier.h"

int main() {
    // Lee el nombre del patrón
    std::string patternName;
    std::cin >> patternName;
    
    // TODO: Crea una instancia de PatternClassifier
    
    // TODO: Usa el clasificador para clasificar el patrón de entrada
    
    // TODO: Si se reconoce el patrón, imprime:
    // "[PatternName] is a [CategoryName] pattern"
    // "Purpose: [CategoryPurpose]"
    
    // TODO: Si no se reconoce el patrón (nullptr), imprime:
    // "Unknown pattern: [PatternName]"
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C++ online