Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Factory, Simple Factory y Abstract Factory

Estas en el tema de Factory, Simple Factory y Abstract Factory en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, Estoy tratando de aprender correctamente el uso del patrón factory puesto que antes lo estaba usando como una fábrica general de cualquier tipo de ...
  #1 (permalink)  
Antiguo 10/08/2012, 08:44
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Factory, Simple Factory y Abstract Factory

Buenas,

Estoy tratando de aprender correctamente el uso del patrón factory puesto que antes lo estaba usando como una fábrica general de cualquier tipo de objetos
La cuestión es que después de leer por varios sitios y realizar un primer ejemplo continuo "sin comprenderlo".

Por ejemplo tengo lo siguiente:

Código PHP:
Ver original
  1. interface IFactory
  2. {
  3.     static public function create($name);
  4. }
  5.  
  6. class DBFactory implements IFactory
  7. {
  8.     private static $database = array('mysql'=>'MySQL', 'postgresql'=>'PostgreSQL'); //DB permitidas
  9.     static public function create($name)
  10.     {
  11.         switch (self::$database[$name]) {  
  12.             case 'MySQL': return new MySQL($name);  
  13.             case 'PostgreSQL': return new PostgreSQL($name);  
  14.             default:  
  15.                 echo 'Tipo de base de datos desconocida';  
  16.         }  
  17.     }
  18. }
  19.  
  20. abstract class DB
  21. {
  22.     protected $_name = NULL;  
  23.      
  24.     public function __construct($name)  
  25.     {  
  26.         $this->_name = $name;  
  27.     }  
  28.  
  29.     public function getName()  
  30.     {  
  31.         return $this->_name;  
  32.     }  
  33. }
  34.  
  35. class MySQL extends DB
  36. {
  37.  
  38. }
  39.  
  40. class PostgreSQL extends DB
  41. {
  42.  
  43. }
  44.  
  45. //Supongamos que el usuario elije la base de datos a la que conectarse desde un select option:
  46. $select_db = 'mysql'; //Nos trae la elección
  47. $objeto = DBFactory::create($select_db);
  48. echo $objeto->getName();

Entiendo que este ejemplo es el llamado "Simple Factory". ¿Estoy en lo correcto?
Ahora bien. mi duda... Factory Method y el Abstract Factory ¿qué diferencia tendrían con éste?.
Por ejemplo, la siguiente imagen explica el patrón Abstract Factory y sinceramente "no veo la diferencia" en cuanto al ejemplo que acabo de poner, sin embargo, mi ejemplo no es el patrón Abstract Factory.


Saludos y gracias,
  #2 (permalink)  
Antiguo 10/08/2012, 08:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Factory, Simple Factory y Abstract Factory

http://www.forosdelweb.com/f68/difer...actory-925846/
  #3 (permalink)  
Antiguo 10/08/2012, 09:20
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Respuesta: Factory, Simple Factory y Abstract Factory

:O ¡que rapidez!

Veamos, me he leído el post que mencionas y me ha quedado claro el tema del Simple Factory y el Factroy Method. De hecho, ahora veo claramente que el ejemplo que puse, es un Simple Factory porque estoy creando diferentes objetos que sé que tienen una relación en concreto con esa fabrica, en este caso la fabrica DBFactory.

Cita:
Factory Method, se usa para separar diferentes Fabricas de Objetos que estan dentro de un mismo componente común, por ejemplo, un objeto que crea formularios, puede tener un fabrica que cree formularios desde un XML, o desde un array, o desde una BDD...
Entiendo por esto que puedo crear un objeto que sea una fabrica de usuarios y que a su vez esta fabrica, cree usuarios desde un XML, BD... ¿no?
He realizado un ejemplo para ver si he entendido el Factory Method, aunque tengo el presagio que esta mal
Código PHP:
Ver original
  1. <?php
  2.  
  3. interface IFactory
  4. {
  5.     static public function createUserXML($name);
  6.     static public function createUserBD($name);
  7. }
  8.  
  9. class UserFactory implements IFactory
  10. {
  11.     static public function createUserXML($name)
  12.     {
  13.         return new UserXML($name);
  14.     }
  15.    
  16.     static public function createUserBD($name)
  17.     {
  18.         return new UserBD($name);
  19.     }  
  20. }
  21.  
  22. abstract class User
  23. {
  24.     protected $_name = NULL;  
  25.      
  26.     public function __construct($name)  
  27.     {  
  28.         $this->_name = $name;  
  29.     }  
  30.  
  31.     public function getName()  
  32.     {  
  33.         return $this->_name;  
  34.     }  
  35. }
  36.  
  37. class UserXML extends User
  38. {
  39.  
  40. }
  41.  
  42. class UserBD extends User
  43. {
  44.  
  45. }
  46.  
  47. $objeto = UserFactory::createUserXML('UserXML');
  48. echo $objeto->getName();

Por otro lado, el patrón Abstract Factory sigo sin cogerlo del todo. El diagrama lo entiendo pero ya esta, no veo claro cuando usarlo y cuando no ya que creo que con un simple factory es suficiente... En fin, sinceramente tengo un lio ahora mismo que no me aclaro ni yo

Saludos y gracias
  #4 (permalink)  
Antiguo 10/08/2012, 11:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Factory, Simple Factory y Abstract Factory

Pues de hecho más la idea (con FactoryMethod) es que te devuelva el mismo objeto pero de diferentes fuentes, o sea en tu ejemplo de usuarios:
Código PHP:
Ver original
  1. <?php
  2. class UserFactory {
  3.     public static function fromXML($sXML)
  4.     {
  5.         // Cargas desde el xml
  6.         return $User;
  7.     }
  8.    
  9.     public static function fromBDD($sId)
  10.     {
  11.         // Cargas desde la bdd
  12.         return $User;
  13.     }
  14.    
  15.     public static function fromText($sTextFile)
  16.     {
  17.         return $User;
  18.     }
  19. }

El AbstractFactory, se usa mucho con inyección de dependencias, ya que la idea es que todo este "atado" usando interfaces, pero nada concreto, la idea es que al configurar el objeto (ya en ejecución) la fabrica sea lo más abstracta posible para soportar esos cambios.

Saludos.
  #5 (permalink)  
Antiguo 11/08/2012, 03:49
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Respuesta: Factory, Simple Factory y Abstract Factory

Entonces con ese código que has puesto, ¿ya se esta implementando el patrón Factory Method? ¿no hace falta implementar ninguna interfaz ni nada? ¿sólo basta con crear una clase UserFactory y que cada método devuelva el mismo objeto pero de diferentes fuentes? ¿eso es todo?

Saludos y gracias una vez más
  #6 (permalink)  
Antiguo 11/08/2012, 10:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Factory, Simple Factory y Abstract Factory

Así es, las interfaces son más usadas para AbstractFactory, ya que como te digo, la idea es que solo a nivel código se devuelvan interfaces, ya es cuando configuras tu fabrica cuando usas el método concreto que va a devolver y la fabrica concreta que va a usar.
  #7 (permalink)  
Antiguo 14/08/2012, 02:23
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Respuesta: Factory, Simple Factory y Abstract Factory

Perfecto una vez más GatorV, me ha quedado claro

Saludos y muchas gracias

Etiquetas: abstract, factory, patron, patterns
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:56.