Anexsoft | Blog y dictado de cursos de Tecnología

En este encontrarás tutoriales de tecnología como PHP, ASP.NET MVC, Front-End, entre otros y cursos exigentes de modalidad online que te ayudarán a crecer profesionalmente.

Queremos mejorar la calidad de nuestros cursos. Por favor ayúdanos llenando esta pequeña encuesta
Patrón de diseño Factory para PHP
Actualizado el 06 Enero, 2015 y leído 3,986 veces
Calificación: Sin calificar 10

Patrón de diseño Factory para PHP

Anexsoft

Vamos hablar de este patrón y para que se entienda de una ves el ejemplo vamos a explicarlo de manera breve y clara sin matemática, física y teoría de relatividad como suelen contarlo otros bloggers. De todas formas se requiere ciertos conocimientos de programación orientada a objetos para poder entederlos.


¿Para que nos sirve?
Nos permite construír objetos en base a nuestra reglas de negocio que seran heredadas de una clase abstracta.


¿Un ejemplo por favor?
Vamos a ver como tema un ejemplo muy real y que pasa a menudo en este mundo la cual es cuando nos piden crear un sistema que se conecte a SQLServer, Mysql, Postgres, Oracle ...
Las posibles soluciones son muchas como crear N clases por separados pero esto nos va a generar un código espagueti y pésimo mantenimiento.

Lo que buscamos con el patrón factory es decirle que reutilizar toda esta lógica en una clase constructora de objetos.


Comenzamos
Vamos a trabajar con la clase Usuario, para la cual le vamos a crear un par de propiedades. Esta clase se conoce como entidad, la cual representa una tabla de nuestra base dedatos y la vamos a usar para agregar nuevos registros, actualizar, listar u obtener resultados. Ya que con ella vamos a mapear la data.

class Usuario
{
private $id;
private $Nombre;

public function __GET($k) { return $this->$k; }
public function __SET($k,$v) { return $this->$k = $v; }
}


Luego necesitamos una clase Usuario que implemente las reglas de negocio, pero para nuestro caso debe ser ABSTRACTA porque no le interesa con quien va a trabajar, esta solo va a imponer sus reglas.

abstract class UsuarioConsultas{
public abstract function Listar();
public abstract function Obtener($id);

public abstract function Registrar(Usuario $obj);
public abstract function Actualizar(Usuario $obj);
public abstract function Eliminar($id);
}


Ahora debemos crear la clases encargadas de hacer la consulta a la base de datos, la cual deben hededar de UsuarioConsultas para que esta imponga sus reglas a seguir. Ya que podríamos cometer el error de crear métodos con diferentes nombres, confusión y dolor de cabeza.

// La clase encargada de devolvernos con que motor de base de datos vamos a trabajar para la clase Usuario
class UsuarioFactory
{
private $db = null;

// Le inyectamos con que clase queremos trabajar (IoC)
public function __CONSTRUCT($db){
$this->db = new $db();
}

public function Listar() { return $this->db->Listar(); }
public function Obtener($id) { return $this->db->Obtener($id); }

public function Registrar($obj) { return $this->db->Registrar($obj); }
public function Actualizar($obj) { return $this->db->Actualizar($obj); }
public function Eliminar($id) { return $this->db->Eliminar($id); }
}

// La clase encargada de hacer consultas a mysql
class UsuarioConsultasMysql extends UsuarioConsultas
{
public function Listar(){ /* Lógica a implementar */ }
public function Obtener($id){ /* Lógica a implementar */ }

public function Registrar(Usuario $obj){ /* Lógica a implementar */ }
public function Actualizar(Usuario $obj){ /* Lógica a implementar */ }
public function Eliminar($id){ /* Lógica a implementar */ }
}

// La clase encargada de hacer consultas a SqlServer
class UsuarioConsultasSqlServer extends UsuarioConsultas
{
public function Listar(){ /* Lógica a implementar */ }
public function Obtener($id){ /* Lógica a implementar */ }

public function Registrar(Usuario $obj){ /* Lógica a implementar */ }
public function Actualizar(Usuario $obj){ /* Lógica a implementar */ }
public function Eliminar($id){ /* Lógica a implementar */ }
}

// La clase encargada de hacer consultas a Oracle
class UsuarioConsultasOracle extends UsuarioConsultas
{
public function Listar(){ /* Lógica a implementar */ }
public function Obtener($id){ /* Lógica a implementar */ }

public function Registrar(Usuario $obj){ /* Lógica a implementar */ }
public function Actualizar(Usuario $obj){ /* Lógica a implementar */ }
public function Eliminar($id){ /* Lógica a implementar */ }
}


Ahora vamos a crear nuestra clase Factory, el cual es el encargado de decirle con que motor de base de datos vamos a trabajar ya que en nuestro constructor le vamos a pasar la clase a instanciar (IoC) lo cual se conoce como inyección de dependencias que es un patrón que va a la par.

Entonces nuestra querida clase lo que hace es recibir la clase a instanciar que puede ser UsuarioConsultasMysql, UsuarioConsultasSqlServer o UsuarioConsultasOracle y con esto tenemos resuelto este problema de instanciar varias clases, o hacer jugaditas. Para nuestro ejemplo basta con instanciar nuestro UsuarioFactory, el se encarga del resto.

class UsuarioFactory
{
private $db = null;

// Le inyectamos con que clase queremos trabajar (IoC)
public function __CONSTRUCT($db){
$this->db = new $db();
}

public function Listar() { return $this->db->Listar(); }
public function Obtener($id) { return $this->db->Obtener($id); }

public function Registrar($obj) { return $this->db->Registrar($obj); }
public function Actualizar($obj) { return $this->db->Actualizar($obj); }
public function Eliminar($id) { return $this->db->Eliminar($id); }
}


Ejemplo en acción

$usuario = new UsuarioFactory('UsuarioConsultasOracle'); // Trabajamos con Oracle
$usuario->Listar();
$usuario = new UsuarioFactory('UsuarioConsultasMysql'); // Trabajamos con Mysql
$usuario->Listar();
$usuario = new UsuarioFactory('UsuarioConsultasSqlServer'); // Trabajamos con SQLServer
$usuario->Listar();

// Ejemlo de un update
$u = new Usuario();
$u->__SET('id', 1);
$u->__SET('Nombre', 'Eduardo Rodriguez');

$usuario->Actualizar($u);


Conclusión: hemos usado el patrón factory para integrar nuestra lógica de trabajar con N base de datos en una sola clase.

En la práctica es complejo implementarlos ya que no se entiende el patrón, o no tienes ídea en que usarlo es por esto que hice un ejemplo muy REAL. Lo recomendable para tus siguientes proyectos es que al momento de comenzar hagas un buen análisis de los requerimientos, modelado de la base de datos y en base a eso ya podras a comenzar a crear tus clases y reglas de negocio usando el patrón factory si es necesario.

¡Adquiera ya!

  • Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#

    Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#
  • Software de Venta e Inventario hecho en PHP y Codeigniter

    Software de Venta e Inventario hecho en PHP y Codeigniter
  • Código de fuente de Red Social desarrollada en ASP.NET MVC

    Código de fuente de Red Social desarrollada en ASP.NET MVC

Últimas publicaciones

Encuesta

¿Cómo nos conociste?

Síguenos

Estudia con nosotros y crece profesionalmente

Nuestros cursos han sido hecho en base a lo que demanda el mercado hoy en día.
La experiencia obtenida es la de un ambiente laboral.

Anexsoft
© 2018 Anexsoft, blog y cursos online de TI.