🚨 ¡Nueva review! ¡Mi teclado ideal! ⌨️ Perfecto para programar, el Logitech MX Keys S . ¡Échale un ojo! 👀

El Patrón Facade: El Botón Mágico que lo arranca todo

Hace más sencillo trabajar con algo complejo.

Escrito por domin el 3 de noviembre de 2025

🧱 El Patrón Facade: La interfaz única para el caos

El Patrón Facade (Fachada) es otro de los patrones GangOfFour, no añade funcionalidad nueva, sino que tiene un propósito muy humilde y muy necesario: simplificar la vida.

El problema que resuelve es este:
¿Cómo puedes usar un subsistema con muchas clases y dependencias complejas sin tener que inicializar 10 objetos y llamar a 20 métodos diferentes?

La respuesta está en crear una única clase Facade que orqueste toda la complejidad interna por ti. Es como un botón de Encendido.

🧱 1. Un ejemplo sencillo: El botón de encendido del PC

Imagina que quieres encender tu ordenador gaming con luces led de feria:

Concepto (Analogía)

Rol en Facade

Tarea Principal

Disco Duro, Tarjeta Gráfica, SO, Luces Led Feria

Subsistemas

Son las clases complejas que hacen el trabajo duro.

Clase SistemaEncendido

Fachada (Facade)

Orquesta las llamadas de las clases de subsistema en el orden correcto.

El Facade no tiene que ser lo único que se use. Si eres un experto en hardware y quieres llamar a las clases individuales, puedes hacerlo. El Facade solo ofrece un camino fácil y seguro para la mayoría de los usuarios.

🛠️ 2. Los dos pilares del patrón facade

A diferencia del patrón de diseño Composite, el Facade es muy directo y solo tiene dos roles que organizar, vamos a verlo con otro caso de ejemplo:

1. El Subsistema (Las Clases Complejas)

2. La Fachada (El Simplificador)

🤔 1. ¿Cuál es el principal objetivo del Patrón Facade?

🛒 3. El ejemplo clásico: comprar en un eCommerce

Imagina el proceso de Comprar un producto. Hay mucha lógica detrás: verificar stock, procesar el pago, enviar un email, actualizar el inventario…

Clase/Rol

Función (Ej. realizarPedido)

Subsistema (Varias Clases)

Hacen funciones de bajo nivel: pagar(), reducirStock(), enviarEmail().

Facade (Clase Pedido)

Define el método realizarPedido() que llama internamente a todas las funciones del subsistema en el orden correcto.

El código del cliente (la página que dice “Gracias por tu compra”) solo tiene que hacer: (new PedidoFacade())->realizarPedido(...). Y se acabaría el jaleo.

🤔 2. En el ejemplo del eCommerce, ¿qué rol cumple la clase `ProcesadorDePagos`?

✅ 4. ¿Por Qué Usarlo?

El Facade te ofrece dos regalos muy importantes:

  1. Aislamiento y Desacoplamiento: El cliente solo depende del Facade, no de las docenas de clases internas del subsistema. Si cambias el subsistema, solo tienes que modificar la Fachada.
  2. Mantenibilidad: Reduce drásticamente el número de líneas de código y de inicializaciones que el cliente debe manejar, simplificando la lógica y haciendo el sistema más fácil de entender.

❌ 5. Desventaja a Considerar

🤔 3. ¿Cuál de los siguientes NO es un beneficio directo del Patrón Facade?

💡 6. Conclusión

El Patrón Facade es la capa protectora que pones entre tu código de negocio y las librerías o módulos complejos que utilizas. Si alguna vez te encuentras inicializando 3, 4 o 5 clases para hacer una sola tarea lógica, necesitas una Fachada. Te ayudará a dormir mejor sabiendo que el caos está bien orquestado tras ese simple método que has definido.

🧠 7. Ejemplo Práctico en PHP

Implementemos el patrón Facade con el ejemplo de un sistema de eCommerce. El objetivo es que el cliente solo tenga que llamar a realizarPedido() sin preocuparse por la lógica interna (inventario, pago, email).

<?php

// 🔹 1. El Subsistema (Las clases complejas)

class GestorDeInventario {
    public function verificarStock(string $productoId): bool {
        // Lógica de verificación...
        echo "   [Inventario] Stock verificado para: $productoId" . PHP_EOL;
        return true;
    }
    public function reducirStock(string $productoId, int $cantidad): void {
        echo "   [Inventario] Stock reducido en $cantidad para $productoId" . PHP_EOL;
    }
}

class ProcesadorDePagos {
    public function cobrar(float $cantidad): bool {
        // Lógica de cobro con pasarela externa...
        echo "   [Pagos] Cobro de " . $cantidad . "€ realizado con éxito." . PHP_EOL;
        return true;
    }
}

class NotificadorDeEmail {
    public function enviarConfirmacion(string $email): void {
        echo "   [Email] Enviando confirmación de pedido a: $email" . PHP_EOL;
    }
}


// 🔹 2. La Fachada (El Simplificador)

class PedidoFacade {
    private GestorDeInventario $inventario;
    private ProcesadorDePagos $pagos;
    private NotificadorDeEmail $notificador;

    // Inicializamos las dependencias (se puede usar inyección de dependencias)
    public function __construct() {
        $this->inventario = new GestorDeInventario();
        $this->pagos = new ProcesadorDePagos();
        $this->notificador = new NotificadorDeEmail();
    }

    /**
     * El método unificado que orquesta la lógica de un pedido.
     */
    public function realizarPedido(string $productoId, int $cantidad, float $precioTotal, string $emailCliente): bool {
        echo "➡️ Iniciando proceso de Pedido..." . PHP_EOL;

        // 1. Verificar stock (Subsistema)
        if (!$this->inventario->verificarStock($productoId)) {
            echo "❌ ERROR: Producto sin stock." . PHP_EOL;
            return false;
        }

        // 2. Procesar el pago (Subsistema)
        if (!$this->pagos->cobrar($precioTotal)) {
            echo "❌ ERROR: Fallo en el procesamiento del pago." . PHP_EOL;
            return false;
        }

        // 3. Reducir stock (Subsistema)
        $this->inventario->reducirStock($productoId, $cantidad);

        // 4. Enviar notificación (Subsistema)
        $this->notificador->enviarConfirmacion($emailCliente);

        echo "✅ Pedido completado con éxito." . PHP_EOL;
        return true;
    }
}

// 🔹 3. Uso del patrón (El Cliente)
echo "El Cliente solo tiene que inicializar la Fachada y llamar a un único método." . PHP_EOL . PHP_EOL;

$pedido = new PedidoFacade();
$pedido->realizarPedido('TSHIRT-001', 1, 29.99, 'cliente@ejemplo.com');

El Cliente solo tiene que inicializar la Fachada y llamar a un único método.

🖥️ Salida del programa:

➡️ Iniciando proceso de Pedido...
   [Inventario] Stock verificado para: TSHIRT-001
   [Pagos] Cobro de 29.99€ realizado con éxito.
   [Inventario] Stock reducido en 1 para TSHIRT-001
   [Email] Enviando confirmación de pedido a: cliente@ejemplo.com
 Pedido completado con éxito.

EA, ¡saluditos y nos vemos en los bares! 🍻