Desarrollo web javascript PHP Typescript

Patrones de diseño: la brújula secreta de todo desarrollador

¿Alguna vez te has encontrado escribiendo el mismo código una y otra vez, solo con pequeñas variaciones?

O peor aún: ¿has tenido que modificar una clase y, de repente, todo el sistema deja de funcionar?

Tranquilo, no estás solo. Ahí es donde entran los patrones de diseño, la forma más elegante de resolver problemas comunes en el desarrollo de software.

¿Qué son los patrones de diseño?

Los patrones de diseño son soluciones comprobadas a problemas recurrentes en la programación.

No son recetas exactas de código, sino guías reutilizables para estructurar tu software de forma clara, escalable y mantenible.

En general, se dividen en tres grandes familias


1. Patrones Creacionales

Controlan la creación de objetos, promoviendo flexibilidad y reutilización.

Ejemplos:

Singleton, Factory Method, Builder, Prototype.

Caso práctico (TypeScript / Angular)

Imagina que tienes un servicio que maneja las notificaciones de tu aplicación, y solo quieres una instancia global:

// notification.service.ts

export class NotificationService {

  private static instance: NotificationService;

  private constructor() {}

  static getInstance(): NotificationService {

    if (!NotificationService.instance) {

      NotificationService.instance = new NotificationService();

    }

    return NotificationService.instance;

  }

  show(message: string) {

    console.log("🔔", message);

  }

}

// Uso en Angular

const notifier = NotificationService.getInstance();

notifier.show("Bienvenido al sistema!");

 

🔹 Ventaja: Garantizas una sola instancia global y centralizada para notificaciones.

🔹 Aporte: Reduces la dependencia y mejoras la modularidad.

2. Patrones Estructurales

Definen cómo se organizan las clases y objetos para formar estructuras más eficientes y flexibles.

Ejemplos:

Adapter, Decorator, Facade, Proxy, Composite.

Caso práctico (Laravel)

Supón que tienes distintas APIs para procesar pagos (PayPal, Stripe, etc.) y quieres unificarlas:

// PaymentAdapter.php

interface PaymentAdapter {

    public function pay($amount);

}

// StripeAdapter.php

class StripeAdapter implements PaymentAdapter {

    public function pay($amount) {

        echo "Procesando pago de $$amount con Stripe 💳";

    }

}

// PayPalAdapter.php

class PayPalAdapter implements PaymentAdapter {

    public function pay($amount) {

        echo "Procesando pago de $$amount con PayPal 🪙";

    }

}

// Uso

$payment = new StripeAdapter();

$payment->pay(100);

🔹 Ventaja: Puedes cambiar de proveedor de pago sin modificar el resto del sistema.

🔹 Aporte: Menor interdependencia y mayor escalabilidad.

3. Patrones de Comportamiento

Regulan la comunicación e interacción entre objetos, optimizando la asignación de responsabilidades.

Ejemplos:

Observer, Strategy, Command, Iterator, State, Visitor.

Caso práctico (Angular – Observer)

Cuando necesitas reaccionar a cambios en datos en tiempo real:

import { BehaviorSubject } from 'rxjs';

class UserService {

  private user$ = new BehaviorSubject<string>('Invitado');

  setUser(name: string) {

    this.user$.next(name);

  }

  getUser() {

    return this.user$.asObservable();

  }

}

// Componente

const userService = new UserService();

userService.getUser().subscribe(user => console.log(`👤 Usuario actual: ${user}`));

userService.setUser('Juan');

 

🔹 Ventaja: Los componentes se actualizan automáticamente cuando cambian los datos.

🔹 Aporte: Mayor cohesión y menos acoplamiento entre partes del sistema.


Conclusión

Los patrones de diseño no son solo teoría: son herramientas reales que te ayudan a escribir código más limpio, mantenible y profesional.

Adoptarlos poco a poco te permitirá pensar como un arquitecto de software, no solo como un programador.

🎓 Consejo: La próxima vez que repitas una solución o te enfrentes a un problema estructural, piensa…

“¿Hay un patrón que ya resuelva esto mejor?”

 

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *