¿Cómo se implementa el patrón "Factory Method" en PHP4? (revisado: 7/11/2006)

En el mundo del "Diseño de Software" existe algo que se llama "Patrones de Diseño". Los patrones de diseño son -mi definición rápida- "la mejor solución probada y documentada que puede aplicarse a un problema conocido y recurrente".

Evitan que reinventemos la rueda para resolver problemas conocidos, y a su vez, hasta nos sirven de modelo para hacer soluciones "reutilizables" y "extensibles" (más información buscar por "principios de diseño de software orientado a objetos").

Existen muchos "patrones" (y a su vez muchos "catálogos" de patrones; el más famoso es el GOF) y el que quiero mostrar como ejemplo es el "Pattern Factory Method" ("Patrón Método Fábrica").

La intención de este patrón es concentrar la creación de los objetos a través de una clase, como forma de control, de orden, o para ocultar complejidad, para que los objetos no se estén creando libremente por todo nuestro sistema. De ahora en más, le pediremos a la Fábrica que nos fabrique el objeto que estamos necesitando.

// Clase Abstracta
class Compra{
    function
Compra(){
    }
    function
toString(){
    }
}

// Heredo de la clase abstracta
class CompraDirecta extends Compra{
    function
CompraDirecta(){
    }
    function
toString(){
       echo
"soy CD";
    }
}

// Heredo de la clase abstracta
class Licitacion extends Compra{
    function
Licitacion(){
    }
    function
toString(){
       echo
"soy Licitacion";
    }
}

// Construcción de la clase "Fábrica"
class Factory{
    var
$obj;
    function
Factory(){
    }
    function
crear($tipo){
       
$this->obj = new $tipo();
       return
$this->obj;
    }
}

// Ejemplo de Uso

// Creo la "fábrica"
$miFact = new Factory();

// Defino un objeto "genérico" y que luego
// la fábrica se encarga de crear según el
// parámetro que reciba.

// En este caso, miCompra se crea como una
// instancia de la clase "CompraDirecta"

$miCompra = $miFact->crear(CompraDirecta);
$miCompra->toString();

// En este caso, miCompra se crea como una
// instancia de la clase "Licitacion"

$miCompra = $miFact->crear(Licitacion);
$miCompra->toString();

Y listo, tengo mi fábrica de objetos "Compras", la cual cuenta con una clase abstracta donde puedo incluir todo el esqueleto común de las compras, y luego, al crear la clase según el tipo de compra, puedo definir sus particularidades.

Si mañana necesito agregar un tipo de compra, por ejemplo "Compra Centralizada", creo una clase con este nombre, heredo de la clase abstracta "Compra" y defino sus particularidades.

No hubo que modificar el código existente ("cerrado al cambio") y se pudo extender su funcionalidad ("abierto a la extensión").

Notas sobre el ejemplo implementado:
  • No hay que olvidar que PHP4 no cuenta con "interfaces", ni con métodos "toString", ni con "clases abstractas", algo que siempre tuvo Java y que ahora lo implementa PHP5 (éramos tan pobres...)

PD: Carlos Cantonnet, gracias por tus clases de UML! ;-)

Que lo disfruten!

Artículo relacionado: ¿Cómo se implementa el patrón "Factory Method" en PHP5?"

Entradas populares