Los patrones de diseño son soluciones probadas y reutilizables para problemas comunes que se presentan en el desarrollo de software. No son bibliotecas o algoritmos que se puedan copiar y pegar, sino guías que describen cómo resolver una situación particular de manera eficiente y escalable. Su objetivo es hacer el código más flexible, mantenible y comprensible.

Los patrones se clasifican en tres categorías principales:

Patrones de Creación (Creational Patterns) 🛠️

Se centran en la creación de objetos, proporcionando mecanismos que aumentan la flexibilidad y reutilización del código.

Singleton (Ejemplo en PHP)

El patrón Singleton asegura que una clase tenga una sola instancia y proporciona un punto de acceso global a ella.


<?php
class Database
{
    private static $instance = null;
    private $connection;

    private function __construct()
    {
        // La conexión real a la base de datos se haría aquí
        $this->connection = "Conexión a la base de datos";
    }

    public static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new Database();
        }
        return self::$instance;
    }

    public function getConnection()
    {
        return $this->connection;
    }
}

// Uso del patrón Singleton
$db1 = Database::getInstance();
$db2 = Database::getInstance();

echo $db1->getConnection(); // Salida: Conexión a la base de datos
echo "<br>";

// $db1 y $db2 son la misma instancia
if ($db1 === $db2) {
    echo "¡Las variables son la misma instancia!";
}
?>

Patrones Estructurales (Structural Patterns) 🧱

Se encargan de la composición de clases y objetos para formar estructuras más grandes y complejas.

Adapter (Ejemplo en PHP)

El patrón Adapter permite que interfaces incompatibles colaboren. Actúa como un traductor entre dos clases que de otra manera no podrían comunicarse.


<?php
interface PaymentGateway
{
    public function sendPayment($amount);
}

class PayPalApi
{
    public function makePayment($amount)
    {
        return "Pago de $$amount realizado a través de PayPal.";
    }
}

class PayPalAdapter implements PaymentGateway
{
    private $paypal;

    public function __construct(PayPalApi $paypal)
    {
        $this->paypal = $paypal;
    }

    public function sendPayment($amount)
    {
        return $this->paypal->makePayment($amount);
    }
}

// Uso
$paypalApi = new PayPalApi();
$adapter = new PayPalAdapter($paypalApi);

echo $adapter->sendPayment(100);
?>

Patrones de Comportamiento (Behavioral Patterns) 🧠

Se ocupan de la comunicación y colaboración entre objetos.

Strategy (Ejemplo en PHP)

El patrón Strategy define una familia de algoritmos, encapsula cada uno y los hace intercambiables. Esto permite seleccionar un algoritmo en tiempo de ejecución.


<?php
interface PaymentStrategy
{
    public function pay($amount);
}

class CreditCardPayment implements PaymentStrategy
{
    public function pay($amount)
    {
        return "Pagando $$amount con tarjeta de crédito.";
    }
}

class PayPalPayment implements PaymentStrategy
{
    public function pay($amount)
    {
        return "Pagando $$amount con PayPal.";
    }
}

class ShoppingCart
{
    private $paymentStrategy;

    public function setPaymentStrategy(PaymentStrategy $strategy)
    {
        $this->paymentStrategy = $strategy;
    }

    public function checkout($amount)
    {
        return $this->paymentStrategy->pay($amount);
    }
}

// Uso
$cart = new ShoppingCart();

// Pagar con tarjeta de crédito
$cart->setPaymentStrategy(new CreditCardPayment());
echo $cart->checkout(50);
echo "<br>";

// Pagar con PayPal
$cart->setPaymentStrategy(new PayPalPayment());
echo $cart->checkout(75);
?>