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 51 de 70.
Los patrones de diseño son soluciones probadas a problemas comunes que los desarrolladores encuentran repetidamente al construir software. En lugar de reinventar la rueda cada vez, los patrones nos brindan un vocabulario compartido y enfoques probados para estructurar el código.
Piense en los patrones de diseño como planos. No le proporcionan código exacto para copiar, sino que describen cómo organizar clases y objetos para resolver desafíos específicos. Cuando alguien menciona "use el patrón Factory aquí", los desarrolladores experimentados comprenden de inmediato la estructura general que se propone.
Los patrones de diseño se dividen en tres categorías principales:
| Categoría | Propósito | Ejemplos |
|---|---|---|
| Creacionales | Cómo se crean los objetos | Singleton, Factory |
| Estructurales | Cómo se componen los objetos | Adapter, Decorator |
| De comportamiento | Cómo se comunican los objetos | Observer, Strategy |
Los patrones que exploraremos se basan directamente en los conceptos de OOP que ya has aprendido: interfaces, herencia, polimorfismo y composición. Cada patrón aprovecha estos fundamentos de maneras específicas para lograr flexibilidad, mantenibilidad o reutilización.
En las próximas lecciones, implementarás varios patrones esenciales comenzando con Singleton, Factory, Observer y Strategy. Comprender estos patrones te ayudará a reconocer soluciones comunes en bases de código existentes y a tomar mejores decisiones arquitectónicas en tus propios proyectos.
Desafío
FácilVamos a construir un sistema de catálogo de patrones sencillo que organice la información de los patrones de diseño en varios archivos. Esto te ayudará a entender cómo se categorizan los patrones mientras practicas una buena organización del código.
Crearás tres archivos para separar las diferentes responsabilidades:
Pattern.cs: Define una clasePatternen el espacio de nombresPatternsque represente un único patrón de diseño. Cada patrón debe tener unName,Category(Creational, Structural, o Behavioral) y unaDescription. Incluye un métodoGetSummary()que devuelva una cadena con formato:[{Category}] {Name}: {Description}PatternCatalog.cs: Crea una clasePatternCatalogen el espacio de nombresPatternsque gestione una colección de patrones. Tu catálogo debe ser capaz de añadir patrones y tener un métodoGetPatternsByCategory(string category)que devuelva una lista de todos los patrones que coincidan con esa categoría. También incluye un métodoGetAllSummaries()que devuelva una lista de cadenas de resumen para todos los patrones del catálogo.Program.cs: Une todo creando un catálogo y poblándolo con patrones basados en la entrada. Luego, muestra los patrones filtrados por categoría.
Recibirás las siguientes entradas:
- Número de patrones a añadir
- Para cada patrón: tres líneas que contienen el nombre, la categoría y la descripción
- Una categoría para filtrar
Después de añadir todos los patrones a tu catálogo, imprime los resúmenes de los patrones que coincidan con la categoría del filtro, uno por línea. Si no hay patrones que coincidan, imprime No patterns found.
Por ejemplo, si las entradas son:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalLa salida debería ser:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classEste desafío demuestra cómo la organización de clases relacionadas en archivos separados mantiene tu base de código limpia y mantenible, ¡un principio que se vuelve aún más importante a medida que implementas patrones de diseño reales en las próximas lecciones!
Hoja de referencia
Los patrones de diseño son soluciones probadas para problemas comunes en el desarrollo de software. Proporcionan planos para organizar clases y objetos en lugar de código exacto para copiar.
Los patrones de diseño se dividen en tres categorías principales:
| Categoría | Propósito | Ejemplos |
|---|---|---|
| Creacionales | Cómo se crean los objetos | Singleton, Factory |
| Estructurales | Cómo se componen los objetos | Adapter, Decorator |
| De comportamiento | Cómo se comunican los objetos | Observer, Strategy |
Los patrones de diseño se basan en conceptos de OOP como interfaces, herencia, polimorfismo y composición para lograr flexibilidad, mantenibilidad y reutilización.
Pruébalo tú mismo
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Lee el número de patrones
int n = Convert.ToInt32(Console.ReadLine());
// Crea un nuevo PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO: Lee los detalles de cada patrón (name, category, description)
// y añádelos al catálogo
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Crea un Pattern y añádelo al catálogo
}
// Lee la categoría por la cual filtrar
string filterCategory = Console.ReadLine();
// TODO: Obtén los patrones por la categoría de filtro
// e imprime sus resúmenes
// Si no coinciden patrones, imprime "No patterns found"
}
}
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
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes