Continuamos la serie de videos sobre patrones de diseño en PHP con el patrón creacional Factory, que consiste en un método para crear objetos cuando no sabemos la clase exacta del objeto que va a ser creado. De esta manera encapsulamos clases en una clase general de la que heredarán distintas subclases. Aunque el ejemplo utilizado es muy sencillo, este patrón es bastante interesante si tenemos en cuenta que podemos redefinir métodos en cada subclase, así como automatizar la creación de objetos utilizando variables (que podemos obtener de un fichero de settings).
Ver screencast (duración: 5:41)
- Descargar videotutorial en alta calidad – MOV (9 MB)
- Descargar videotutorial optimizado para iPod/iPhone – M4V (6 MB)
Podéis ver el resto de screencasts en la página de videotutoriales, o suscribiros al podcast de iTunes.
Ejemplo de implementación
<?php abstract class Vehiculo{ protected $numruedas; public function getNumruedas(){ return $this->numruedas; } } class Coche extends Vehiculo{ protected $numruedas = 4; } class Bici extends Vehiculo{ protected $numruedas = 2; } class VehiculoFactory{ public static function crearVehiculo($tipo){ $clasebase = 'Vehiculo'; if(class_exists($tipo) && is_subclass_of($tipo, $clasebase)) return new $tipo; else throw new Exception("No se reconoce el tipo de vehiculo $tipo"); } } $vehiculo = Array('Bici', 'Coche'); foreach ($vehiculo as $v) { echo "El vehiculo $v tiene ".VehiculoFactory::crearVehiculo($v)->getNumruedas()." ruedas<br />"; } ?> |
[…] This post was mentioned on Twitter by Cosme Fulanito. Cosme Fulanito said: Videotutorial: Patrones de diseño en PHP – Factory Pattern – http://bit.ly/aFKYfx […]
me gusto el tutorial
queria saber mas de los patrones de diseño y llegue a tu web.
saludos
[…] original here: Videotutorial: Patrones de diseño en PHP – Factory Pattern « David … Agregar a […]
Que tipo de implementaciòn es esta David, podrias decirme cual de estas implementaciones es:
1. Noob Implementation
2. Static Factory with Reflection
3. Self Registration without Reflection
4. Self Registration with Reflection
porfavor te lo agradecere infinitititivamente jajaja gracias.
@Blanca El ejemplo que pongo es muy sencillo, para hacerse una idea de cómo funciona y sus ventajas, sin meterme en implementaciones concretas (que hay muchas, y dependen del lenguaje también). ‘Reflection’ se utiliza para crear dinámicamente una instancia de un tipo, y ‘self registration’ se aplica cuando cada clase concreta (en este caso ‘coche’ y ‘bici’ que heredan de ‘vehiculo’) se identifica a sí misma, por lo tanto diría que la implementación sería ‘self registration with reflection’.
muchisimas gracias David,
he intentado suscribirme a tu blog y no he podido
una pregunta que editor de php utilizastes he intentado con phpdesigner, y winsyntax y no me funciona,
este tema es bien complejo y bastante dificil de entender, me gusta leer mucho sobre lo que estudio. me gusta tu blog.
@Blanca Utilizo textmate (es un editor para mac), no uso windows, aunque hay un clon parecido para windows que se llama e-texteditor. Aptana es muy completo y multiplataforma, aunque un poco pesado para mi gusto.
Sobre suscribirte, ¿qué problema te da? En el lateral esta la dirección al feed de RSS, sólo tienes que añadirla a tu lector de RSS. También puedes suscribirte vía email, aunque lo he activado recientemente y por eso no he puesto ningún enlace, pero el link es este: http://feedburner.google.com/fb/a/mailverify?uri=DavidRojas&loc=es_ES
Listo! que Felicidad
OYE Te seguire de cerca en este tema!!! y en tanto aprenda te aportare
Hola David, me cuesta ver un poco la utilidad de este patrón, podrías orientarme con un ejemplo de uso real?
Porque no veo la necesidad de crear una clase para que cree a otra, por que no usar simplemente:
foreach ($vehiculo as $v) {
$obj = new $v;
echo «El vehiculo $v tiene $obj->getNumruedas().» ruedas»;
}
@Enrique En mi ejemplo no es útil, obviamente, está hecho simplemente para que se vea la idea en qué consiste. Pero un uso real, por ejemplo imagina que construyes un framework con una capa de abstracción para conectar a la base de datos, y tienes clases genéricas que manejan las operaciones con la BD, y después clases específicas para utilizar distintos drivers de BD (mysql, sqlite, mssql, etc.). Tendríamos una clase factory que instanciaría una clase u otra en tiempo de ejecución, dependiendo del driver de conexión que queramos usar. La idea de todos estos patrones principalmente es encapsular y organizar el código para un mantenimiento más eficiente.
Gracias por los tutoriales. Te he intentado mandar un correo; Espero que haya llegado.
Saludos y gracias por las explicaciones
Hola David, Muy claros los videos y la forma de relatar que has usado. Son muy didácticos cuando ya conoces php. Felicitaciones y te animo a que sigas publicando otros más.
Felicitaciones David. El tema patrones es difícil más aún para un novato como yo. Tú lo estás haciendo fácil de comprender.
Muchas gracias. Espero con entusiasmo tu video tuto sobre el patrón composite.
Bendiciones.