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

Siguiendo en la línea del artículo anterior sobre el tema Patrones de Diseño, donde se trataba en particular el patrón "Factory Method" en PHP4", se implementará un ejemplo aprovechando las nuevas características que ofrece la versión 5 de PHP.

Descargos al respecto

Los "patrones de diseño" se representan con diagramas UML y son una guía para su implementación. No necesariamente se puede/debe implementar el patrón de la misma forma en todos los lenguajes, y nosotros además podemos modificarlos para adaptarlos a nuestras necesidades particulares.

Implementación

Se definen dos clases, "Conductor" y "Vehiculo", y una "Fábrica" de objetos que tendrá la responsabilidad de crear a demanda las instancias de esas clases.

class Conductor{

function
__toString() {

return
"Soy un Conductor";

}

}

class
Vehiculo{

function
__toString(){

return
"Soy un Vehiculo";

}

}

abstract class Fabrica {

public static function crear($tipo){

return new
$tipo();

}

}

Ejemplo de Uso
echo Fabrica::crear("Conductor");

echo
Fabrica::crear("Vehiculo");
En ambos casos usamos la "Fabrica" sin tener la necesidad de instanciarla, invocando directamente a la clase y usando el método "crear". La fábrica necesita recibir por parámetro el nombre de la clase del objeto que se desea crear, y ella nos devolverá una instancia de la clase solicitada.

Sobre el "toString"

Como las clases implementan los métodos "toString", cuando hacemos "echo" de la instancia recibida, el método es invocado automáticamente y nos devuelve la descripción del objeto.

El "toString" es un concepto muy usado en la POO: generalmente es un método reservado (como el constructor, el destructor, etc) y por definición es la forma estándar de convertir un objeto en String.

Resumen final

La ventaja de este "patrón de diseño" es que tenemos centralizada la creación de objetos en una entidad que a pedido nos devuelve instancias de los mismos. Es una forma de tener el control de la creación de objetos, y donde podemos agregar procedimientos para registrar cada creación y actuar en consecuencia (estadísticas, seguridad, etc).

¡Saludos, hasta el próximo patrón!

4 comentarios:

Alejandro dijo...

Buenas tardes, oye amigo, me encargarón una tarea de POO, pero la verdad no entiendo nada, me podrías ayudar, el programita tiene que obtener el área de un circulo, un triangulo y un rectangulo, para lo cual se tiene que hacer con clases, el patron factory, de ante mano muchas gracias.

Enrique Place dijo...

Estimado Alejandro:

Tengo por política no hacer los deberes de estudio de nadie, ya que te perjudico más de lo que te ayudo.

Estás para aprender, por lo tanto pon un mínimo de esfuerzo.

Unknown dijo...

me parece que el ejemplo que pones es sobre el patron Factory, aunque factory method es una versión de este ultimo tiene algunas diferenecias pues se deja a las subclases definir los objetos a crear.

Anónimo dijo...

He estado comiendome el coco para poder instanciar clases con Factory pero que requerian argumentos en el constructor.
En contre la solucion con Reflection, dejo aqui el ejemplo.

class Factory
{
public static function getInstance($id, $args = array())
{
$class = ucfirst($id);

if (!class_exists($class)) {
return false;
}

if (is_array($args) && sizeof($args) > 0) {
$rc = new ReflectionClass($class);

if ($rc->getMethod('__construct')) {
$cls = $rc->newInstanceArgs($args);
return $cls;
}
}

return new $class();

}
}

Saludos

Entradas populares