🧩 PATRONES DE DISEÑO: seis soluciones para entender mejor cómo organizar tu código
PARA ENTENDER EL ESQUEMA
Sobre esta infografía
Cuando desarrollamos software, algunos problemas se repiten: crear objetos con distintas variantes, conectar sistemas incompatibles, añadir funciones o comunicar cambios.
Los patrones de diseño recogen formas conocidas de resolver esos problemas. Nos proporcionan un vocabulario común y una estructura que podemos adaptar al contexto.
En esta infografía explico seis patrones con ejemplos en C#, agrupados en tres familias. 👇
🟣 CREACIONALES: ¿cómo creamos los objetos?
1️⃣ FACTORY METHOD — Delegar la creación
Una clase base define una operación de creación y las subclases deciden qué producto concreto devolver.
📦 En el ejemplo, Logistica declara Crear() y LogisticaPostal devuelve un EnvioPostal.
El código que utiliza esa creación puede trabajar con el contrato IEnvio.
💡 Encaja cuando una jerarquía necesita especializar el tipo de objeto que crea.
2️⃣ BUILDER — Construir paso a paso
Permite separar los pasos de construcción de la representación final de un objeto.
📦 PedidoBuilder configura el cliente, marca el pedido como urgente y finalmente lo construye:
new PedidoBuilder().Para("Ana").Urgente().Build();
💡 Resulta útil cuando la construcción incluye varias opciones o etapas. El encadenamiento de métodos facilita la lectura, pero por sí solo no define el patrón.
🩵 ESTRUCTURALES: ¿cómo combinamos los objetos?
3️⃣ ADAPTER — Hacer compatibles dos interfaces
Traduce el contrato que espera nuestra aplicación al que ofrece un componente existente.
🔌 La aplicación llama a Pagar(), mientras PagoAdapter delega en Cobrar() de una pasarela antigua.
💡 Permite integrar ese servicio sin modificar su implementación.
4️⃣ DECORATOR — Añadir comportamiento
Envuelve un objeto, conserva su contrato y añade funciones antes o después de delegar en él.
✉️ ConRegistro recibe un IAviso, registra la operación y llama al aviso original:
new ConRegistro(new Email()).Enviar();
💡 Podemos incorporar responsabilidades combinando objetos, sin crear una subclase para cada combinación.
🟠 DE COMPORTAMIENTO: ¿cómo colaboran los objetos?
5️⃣ STRATEGY — Intercambiar algoritmos
Encapsula distintas reglas detrás de un mismo contrato.
🏷️ SinDescuento mantiene el importe; DescuentoVip aplica una reducción del 10 %. Ambos implementan IDescuento.
💡 El cliente puede recibir la estrategia que necesita y utilizarla sin conocer sus detalles internos.
6️⃣ OBSERVER — Avisar de un cambio
Un emisor notifica un acontecimiento a sus suscriptores.
🔔 En el ejemplo, Tienda publica PedidoCreado. Los componentes suscritos pueden reaccionar cuando se confirma el pedido.
En C#, los eventos permiten aplicar esta idea.
💡 Conviene gestionar las suscripciones y recordar que estos eventos no implican ejecución asíncrona.
🎯 La decisión empieza por el problema:
• Crear variantes → Factory Method.
• Construir por pasos → Builder.
• Adaptar interfaces → Adapter.
• Añadir funciones → Decorator.
• Cambiar reglas → Strategy.
• Notificar cambios → Observer.
Un patrón aporta valor cuando hace que el código resulte más fácil de entender, modificar y mantener.
✍️ Oscar de la Cuesta
🌐 palentino.es
#PatronesDeDiseño #CSharp #Programación #DesarrolloDeSoftware #ArquitecturaDeSoftware
infograph