El patrón Factory Method es uno de mis preferidos, antes que no tenia ni idea que era un patrón también lo usaba sin saberlo. Pero vayamos al grano y veamos en que consiste este patrón.
¿Para que se usa este patrón?
Para hacer instancias, para crear objetos de alguna clase.
Relacionarlo con: Factory Method –> “Método de Fabricación de Objetos”
Situación o contexto para usar este patrón:
Por ejemplo, si no queremos que realicen instancias a clases directamente o si queremos abstraer por completo nuestras clases base, separando todo el código de creación de objetos en un método o en otra clase. etc.
Imaginemos que estamos trabajando en un equipo, al comenzar el desarrollo de cualquier proyecto serio, los arquitectos tienen el trabajo de crear las interfaces y las clases helpers y factory. ¿Porque lo hacen? Pues, imagina que cada programador implemente de distinta manera cada objeto, seria un dolor de cabeza en solo pensarlo.
Para esto esta este patrón, para separar el código de creación de objetos en un método o clase. No es mas que eso. ;)
Ejemplo:
public abstract class Perro {
public string nombre;
public string raza;
public abstract string GetNombre();
public enum nombresdeperros { Pepe, Mumi, Conan }
}
public class PerroPepe : Perro
{
public PerroPepe()
{
nombre = "Pepe";
raza = "Ovejero Alemán";
}
public override string GetNombre()
{
return nombre;
}
}
public class PerroMumi : Perro {
public PerroMumi()
{
nombre = "Mumi";
raza = "Mestizo";
}
public override string GetNombre()
{
return nombre;
}
}
public class PerroConan : Perro
{
public PerroConan()
{
nombre = "Conan";
raza = "Boxer";
}
public override string GetNombre()
{
return nombre;
}
}
//Clase Factory
public static class PerroFactory{
//El Factory Method
public static Perro CrearPerro(Perro.nombresdeperros nombre) {
switch (nombre) {
case Perro.nombresdeperros.Pepe:
return new PerroPepe();
break;
case Perro.nombresdeperros.Conan:
return new PerroConan();
break;
case Perro.nombresdeperros.Mumi:
return new PerroMumi();
break;
default:
break;
}
//No hay perro con ese nombre
throw new Exception("Tipo no reconocido");
}
}
class Program
{
static void Main(string[] args)
{
Perro mumi =
PerroFactory.CrearPerro(
Perro.nombresdeperros.Mumi);
Console.WriteLine(mumi.nombre + " es " + mumi.raza);
}
}
Actualización:
Diego me señaló un error, en este ejemplo se ve un patrón simple de Factory. Ahora mas abajo les muestro un ejemplo completo aplicando Factory Method como es debido. Gracias Diego!
using System;
public abstract class Perro {
public string nombre;
public string raza;
public abstract string GetNombre();
public enum nombresdeperros { Pepe, Mumi, Conan }
}
public class PerroPepe : Perro {
public PerroPepe() {
nombre = "Pepe";
raza = "Ovejero Alemán";
}
public override string GetNombre() {
return nombre;
}
}
public class PerroMumi : Perro {
public PerroMumi() {
nombre = "Mumi";
raza = "Mestizo";
}
public override string GetNombre() {
return nombre;
}
}
public class PerroConan : Perro {
public PerroConan() {
nombre = "Conan";
raza = "Boxer";
}
public override string GetNombre() {
return nombre;
}
}
abstract class Creator {
public abstract Perro FactoryMethod();
}
class MumiCreator : Creator
{
public override Perro FactoryMethod() {
return new PerroMumi();
}
}
class ConanCreator : Creator {
public override Perro FactoryMethod() {
return new PerroConan();
}
}
class PepeCreator : Creator {
public override Perro FactoryMethod() {
return new PerroPepe();
}
}
public static class PerroFactory {
public static Perro CrearPerro(Perro.nombresdeperros nombre) {
switch (nombre) {
case Perro.nombresdeperros.Pepe:
return new PepeCreator().FactoryMethod();
break;
case Perro.nombresdeperros.Conan:
return new ConanCreator().FactoryMethod();
break;
case Perro.nombresdeperros.Mumi:
return new MumiCreator().FactoryMethod();
break;
default:
break;
}
//No hay perro con ese nombre
throw new Exception("Tipo no reconocido");
}
}
class Program {
static void Main(string[] args) {
Perro mumi =
PerroFactory.CrearPerro(
Perro.nombresdeperros.Mumi);
Console.WriteLine(mumi.nombre + " es " + mumi.raza);
}
}