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);
?>