martes, 18 de marzo de 2008

Patrón Factory

Cuando empecé este blog la intensión era meter contenido técnico fácil de asimilar para los novatos en el desarrollo o bien para quienes no conociera una tecnología en particular, aunque como se daran cuenta he posteado muy poco contenido técnico por lo cual trataré de enderezar el camino con algunos post técnicos de vez en cuando, si ven algunas líneas de código las veran en c#.

Comenzaré por tratar de explicar de la manera más sencilla el patrón de diseño de "Factory" para más información sobre patrones de diseño en la wikipedia pueden encontrar información básica y algunos links interesante.

 Categoría 

Dentro de los patrones de diseño de software existen distintas categorías, el Factory es parte de los llamados "Creacionales". Los patrones creacionales buscan encontrar la mejor manera de crear objetos. El patrón factory en concreto, define una interfase para crear un objeto, pero delega la responsabilidad de instanciarlo a sus subclases...ya sé que suena raro pero más adelante voy a ver si queda claro.

 Un caso de la vida real   

Si hacemos una pequeña analogía con la realidad, el patrón de "factory" es el equivalente a muchas de los procesos industriales que se realizan comunmente, imaginemos el caso de una fábrica de juguetes, una máquina especial inyecta plástico fundido en moldes que al enfriarse producen una pieza, o quizá un juguete completo, en tal caso, la máquina que inyecta el plástico sería la interfase y los moldes las subclases que al final crean un tipo particular de objeto, o que tal una pizzeria hay diferentes recetas que con distintos ingredientes nos dan una variedad distinta de pizza, en tal caso cada variedad distinta de pizza es producto de una receta base que y de algunos ingredientes que toda pizza para llamarse pizza debe contener(aunque aquí en México les valen las recetas base...) este ejemplo está descrito a profundidad en el libro de Head First: Design Patterns, un libro que todo desarrollador debería leer y recomendar. Otros ejemplos que pueden ayudarnos a entender seria un factory de músicos de un orquesta o una fábrica de zapatos.

Implementación de muestra

public interface SerVivo

{

    public void Respirar();

    public void Comer();

    public void Morir();

    public void Reproducirse();

}

Como se abran dado cuenta este patrón tiende a ser entendido de manera muy sencilla cuando lo pensamos de manera jerárquica y es que en verdad es así, aquí les dejo un ejemplito de cómo Dios creo al mundo con objetos.

En el principio todo era una interfaz

Dios creo la interfaz y vio que era bueno entonces comenzó a crear criaturas sobre la aplicación

public class Serpiente : SerVivo

{

    public void Respirar()

    {

        UsarPulmones();

    }

    public void Comer()

    {

        BuscarRatones();

    }

    public void Reproducirse()

    {

        CrearNidoParaHuevos();

    }

}

public class Hombre : SerVivo

{

    public void Respirar()

    {

        UsarPulmones();

    }

    public void Comer()

    {

        Cazar();

        RecolectarFrutos();

    }

    public void Reproducirse()

    {

        EnviarSolictudParaCreaciónDeEva();

    }

}

Como pueden ver tanto la serpiente como el hombre son criaturas del Dios de los objetos que mantienen comportamientos comunes para todos lo seres vivos, sin embargo los hábitos alimenticios de ambos son distintos y a la serpiente no le interesa Eva para reproducirse, esto comprende otro patrón muy sencillo llamado Strategy, del cual hablaré en futuras entregas.

Esto es sólo una pequeña introducción que trata de ilustrar el concepto del Factory, en futuras entregas les mostraré código para usar lo que hemos hecho hoy, mientras tanto los dejo con algunas preguntas

Y ahora sí una fábrica de criaturas(que mundo tan feo vas a crear sólo serpientes y hombres, trae a Eva!... y Lucía y Ana y Victoria, mujeres, mujeres!!! -Oh bestias controlen sus ansias ya vendrán las mujeres algún día)

public class FábricaDeCriaturas

    {

        public static SerVivo CrearOrganismo(string Tipo)

        {

            switch (Tipo)

            {

                case "Hombre":

                    return new Hombre();

                    break;

                case "Serpiente":

                    return new Serpiente();

                    break;

                default:

                    return null;

                    break;

            }

        }

    }

Hemos creado una fábrica de criaturas, a la cual sólo le indicamos que tipo de criatura deseamos obtener y hace transparente la manera en la que lo hace, devolviéndonos un objeto que hereda de la interfase SerVivo. Podríamos usar un enumerador, para no usar un parámetro string y algunos otras mejoras pero creo que así se aprecia mejor la manera en que funciona.

Y luego, ¿cómo lo uso?

Vamos a crear una lista de especies que habitan el mundo y vamos a poner como primeros pobladores del planeta al Hombre y a la serpiente y les indicaremos que se empiecen a reproducir para así poblar el mundo de los objetos.

List<SerVivo> especiesDelMundo = new List<SerVivo>();

especiesDelMundo.Add(FabricaDeCriaturas.FábricaDeCriaturas.CrearOrganismo("Hombre"));

especiesDelMundo.Add(FabricaDeCriaturas.FábricaDeCriaturas.CrearOrganismo("Serpiente"));

foreach (SerVivo var in especiesDelMundo)

{

    var.Reproducirse();

}

Y pues bueno, espero les sirva, no duden en preguntar si necesitan que abunde más en alguno de los puntos o si desean que aborde otro tema de su interés.

6 comentarios:

Anónimo dijo...

Felicitaciones me parece una muy buena explicación gracias por contribuir al mundo

Rulas dijo...

Gracias José, que bueno que te haya servido...

Anónimo dijo...

nave! buena explicación

Renato dijo...

Ya habia escuchado que google es un dios, pero no que dios habia usado POO para crear el mundo.

Muy buen ejemplo

Saludos

Rulas dijo...

Christian, Renato:

Gracias por el comentario!

Anónimo dijo...

http://markonzo.edu linenhall synergise http://www.lisanovalive.com/profiles/blogs/tempurpedic-memory-foam http://vator.tv/person/biofreeze-coupon http://forums.maniacalragepodcast.com/forums/4/topics/373 http://aviary.com/artists/Infrared-Sauna