Bienvenidos sean a este post, hoy veremos brevemente el otro patron que mencionamos en este post.
Una cosa que no debemos confundirnos es que patron de fabrica no es lo mismo que metodos de fabrica o fabricas abstractas. Estos dos son patrones creacionales que proveen mecanismos de creacion de objetos.
El meodo de fabrica nos provee una interface para la creacion de objetos en la clase base y permite a las clases derivadas modificar los objetos que seran creados.
Con esto comentado vamos a lidiar con las logisticas para nuestro proyecto, y los metodos de fabrica nos pueden ayudar esto. Cuando hablamos de Diseño y planeo de Testing en este post, mencionamos un tema a tener en cuenta como es la Logistica, en ese caso fue para agregar mas inforrmacion cuando el usuario no se encuentra no solo cerca del galpon, sino que ni siquiera en el mismo pais. Esto nos lleva a que debemos elegir el transporte correcto para enviar el producto al comprador. Ahora debemos diseñar un sistema flexible de administracion de logistica.
Si bien, diferentes formas de transporte significa que requiere diferentes implementaciones pero al igual que vimos en post anteriores podemos convergerlas a todas en una misma interfaz. Veamos un ejemplo basico:
class Transporte
{
void envio(Producto, Domicilio) = 0;
};
Esta representa a todos los tipos de transporte y dentro tenemos un solo metodo que servira como referencia para hacer un override en las clases herederas. Veamos algunas que podemos crear:
class Avion: public Transporte
{
void envio(Producto, Domicilio);
};
class Camion: public Transporte
{
void envio(Producto, Domicilio);
};
class Barco: public Transporte
{
void envio(Producto, Domicilio);
};
Ya tenemos cada transporte para las distintas maneras de enviar nuestros productos. Si observan, podran notar que cubrimos aire, tierra y mar. Con lo cual no habra excusas para poder enviarlos, inclusive se podria agregar alguno mas como un dron para envios mas cercanos o tambien bicicleta. Vamos a suponer que diseñamos una clase base llamada Logisticas, la cual sera responsable por todo lo relacionado con la logistica. Veamos como puede ser esta clase con sus derivadas:
class Logisticas
{
Transporte* crear_transporte() = 0;
void plan_ruta() = 0;
double getETA() = 0;
};
class LogisticaRuta : public Logisticas
{
Camion* crear_transporte override () {
return new Camion();
}
// resto del codigo omitido por brevedad
};
class LogisticaAire : public Logisticas
{
Avion* crear_transporte override () {
return new Avion();
}
// resto del codigo omitido por brevedad
};
class LogisticaMar : public Logisticas
{
Barco* crear_transporte override () {
return new Barco();
}
// resto del codigo omitido por brevedad
};
Primero definimos la clase base llamada Logisticas, en ella tendremos tres metodos. El primero es para definir el tipo de transporte que crearemos y para ello usaremos la clase que creamos anteriormente, los siguientes dos metodos son para el planeo de la ruta y almacenar la autorizacion electronica de viaje (ETA) en donde sea necesario. Luego tenemos tres clases que serviran para manejar las distintas vias de envio (Aire, Mar y Tierra). Pero observen la particularidad en cada una de ellas, al definir al metodo crear_transporte no usamos a Transporte sino a la clase relacionada al tipo de camino que usara. Por ejemplo, para Ruta usarmos a Camion. Esto es gracias a que al ser herederas de Transporte siempre podremos acceder a ellas. Inclusive podemos hacer lo siguiente:
Transporte* transporte_camion = new Camion();
Volviendo al codigo anterior, el metodo que define al metodo crear_transporte es lo que se denomina como patron de fabrica. Porque el metodo no devuelve el tipo original sino uno derivado de este. Y si prestan atencion, tambien se esta aplicando un principio de SOLID porque esta creacion desacopla al objeto del objeto original.
En resumen, hoy hemos visto a patron de fabrica, factory pattern, que es, para que sirve, como se utiliza, un ejemplo practico para verlo en accion, y como esto nos permite mantener algunos de los principios de SOLID. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
