Llenar tu código de new Clase() dificulta el mantenimiento. En 2026, centralizar la creación de objetos es clave para un sistema desacoplado.

Solución Rápida (Code Snippet)

Crea una fábrica de transportes según el tipo que necesite tu aplicación.

interface Transporte {
    public function entregar(): string;
}

class Camion implements Transporte {
    public function entregar(): string { return "Entrega por tierra en camión."; }
}

class Barco implements Transporte {
    public function entregar(): string { return "Entrega por mar en barco."; }
}

class LogisticaFactory {
    public static function crearTransporte(string $tipo): Transporte {
        return match($tipo) {
            'tierra' => new Camion(),
            'mar' => new Barco(),
            default => throw new Exception("Tipo de transporte no válido.")
        };
    }
}

// Uso:
$transporte = LogisticaFactory::crearTransporte('tierra');
echo $transporte->entregar();

Cómo funciona

  1. Abstracción: Todas las clases que la fábrica crea deben implementar la misma interfaz. Esto garantiza que el resto de tu código sepa cómo interactuar con ellas.
  2. Encapsulamiento: La lógica de decidir qué clase usar está en un solo lugar (LogisticaFactory). Si mañana añades “Avión”, solo tocas la Factory.
  3. Uso de match: PHP 8.3 aprovecha la potencia de match para hacer que las fábricas sean extremadamente legibles y seguras.

¿Por qué usar Factory?

  • Desacoplamiento: El cliente que pide el objeto no necesita saber cómo se construye ni qué clase específica es.
  • Consistencia: Asegura que todos los objetos creados cumplan con los requisitos necesarios (ej. configuración inicial).

Enlaces Internos


Preguntas Frecuentes

¿Factory Method vs Abstract Factory?

Factory Method crea un solo tipo de objeto. Abstract Factory crea “familias” de objetos relacionados (ej. un conjunto de botones y campos de texto para un tema oscuro).

¿Puedo inyectar la Factory?

Sí, de hecho es una excelente práctica inyectar fábricas en tus servicios para mantener la flexibilidad total.