Abstract Factory

 

Nuestra Abstract Factory se enfrentara a la creación de dos mundos… Winking smile

La teoría nos indica que abstract Factory proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas. (Dice tanto y nada al mismo tiempo)

En nuestro ejemplo: Las familias estarán compuestas por amo y mascota de la tierra y marte.

Nuestro programa debe permitir que el amo pasee a la mascota al amanecer y debe funcionar tanto en la tierra como en marte. Como ya deduces el comportamiento entre los objetos está indicado pero no que objetos lo realizara.

Pasear mascota lo debe hacer un humano y un marciano. Cada uno tendrá su mascota un perro y un MartMasco respectivamente.

A este punto ya sabes cuál es el problema y entonces podemos asimilar una solución

(Cuesta aprender cuando nos dan soluciones a problemas que no tenemos.)

La estructura del patron esta compuesta por:
-AbstractFactory: Es la definición de la interfaces de las factorías.
-Factorías Concretas: Estas son las diferentes familias de productos.
-Producto abstracto: Definición de las interfaces para la familia de productos genéricos.
-Producto concreto: Implementación de los diferentes productos.
-Cliente: La clase que llamará a la factoría adecuada

En nuestro ejemplo:
-Abstract factory: MundoFactory)
-Concrete factory: TierraFactory y MarteFactory
-Abstract product: Amo y Mascota
-Product: Humano,Marciano, Perro y MartMasco
-Client: Vida

La implementacion de la AbstractFactory  y los AbstractProduct  puedes realizarla mediante  _interface_ o _abstract class_, para este ejemplo use clases.

Así se ve nuestro diagrama de clase:

diagrama

La siguiente imagen es el patron en su diagrama UML:

image

Llega el momento del codigo (comentarios entre linea):

    class Program
    {
        public static void Main()
        {
            MundoFactory m_MundoFactory;
            Vida m_vida;
            
            
            m_MundoFactory = new TierraFactory();
            m_vida = new Vida(m_MundoFactory);
            m_vida.AlAmanecer();

            m_MundoFactory = new MarteFactory();
            m_vida = new Vida(m_MundoFactory);
            m_vida.AlAmanecer();

            Console.ReadKey();
        }
    }

    //AbstractFactory
    abstract class MundoFactory
    {
        public abstract Mascota CrearMascota();
        public abstract Amo CrearAmo();
    }
    
    //ConcreteFactory
    class TierraFactory : MundoFactory
    {
        public override Mascota CrearMascota()
        {
            return new Perro();
        }

        public override Amo CrearAmo()
        {
            return new Humano();
        }
    }

    //ConcreteFactory
    class MarteFactory : MundoFactory
    {
        public override Mascota CrearMascota()
        {
            return new MartMasco();
        }

        public override Amo CrearAmo()
        {
            return new Marciano();
        }
    }

    //AbstractProduct
    abstract class Mascota
    {
    }
    
    //AbstractProduct
    abstract class Amo
    {
        public abstract void PasearMascota(Mascota mascota);
    }

    //Product
    class Perro : Mascota
    {
    }
    
    //Product
    class Humano : Amo
    {
        public override void PasearMascota(Mascota mascota)
        {
            Console.WriteLine("El " +  this.GetType().Name +" Paseando a su: " + mascota.GetType().Name);
        }
    }

    //Product
    class MartMasco : Mascota
    {
    }

    //Product
    class Marciano : Amo
    {
        public override void PasearMascota(Mascota mascota)
        {
            Console.WriteLine("El " +  this.GetType().Name +" Paseando a su: " + mascota.GetType().Name);
        }
    }

    //Client
    class Vida
    {
        //En el cliente solo trabajamos con las clases abstractas o interfaces.
        private Amo _Amo;
        private Mascota _Mascota;
        
        //Recibe la fabrica concreta por parametro desde el consumidor
        //y crea los objetos pertenecientes a su mundo
        public Vida(MundoFactory factory)
        {
            _Amo = factory.CrearAmo();
            _Mascota = factory.CrearMascota();
        }
        
        //Al llamar este metodo el ejecuta el correspondiente 
        //segun la fabrica (mundo) actual.
        public void AlAmanecer()
        {
            _Amo.PasearMascota(_Mascota);
        }
    }

El resultado es:

image

Link del proyecto: http://dl.dropbox.com/u/26490398/c/nplanchart.wordpress.com_AbstractFactory.zip

Bien, eso es todo, espero que este pequeño articulo te ayude con el entendimiento del patron. Regresa pronto puede que ya tenga mas patrones Winking smile.

Cualquier duda tienes los canales necesarios para hacermela llegar, EXITO!!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s