martes, 19 de junio de 2007

El Patrón Abstract Factory

Este patrón es útil cuando se necesita instanciar clases complejas y devuelven varios objetos en conjunto.

A continuación voy a presentar un ejemplo muy simple de este patrón.




using System;

using System.Collections.Generic;

using System.Text;



namespace carpinteriaFactory

{

public enum tipoTabla

{

Cuadrada,

Redonda,

Ovalada

}

class tabla

{

private tipoTabla _tipo = tipoTabla.Cuadrada;



public tipoTabla Tipo

{

get { return _tipo; }

set { _tipo = value; }

}



public tabla(tipoTabla tipo)

{

Tipo = tipo;

}

}



public enum tipoPata

{

Cuadrada,

Redonda

}

class Pata

{

private tipoPata _tipo = tipoPata.Redonda;



public tipoPata Tipo

{

get { return _tipo; }

set { _tipo = value; }

}



public Pata(tipoPata tipo)

{

this.Tipo = tipo;

}

}



public class Mueble

{



}



class Mesa : Mueble

{

private Pata[] _Patas;



public Pata[] Patas

{

get { return _Patas; }

set { _Patas = value; }

}



private tabla _tabla;



public tabla Tabla

{

get { return _tabla; }

set { _tabla = value; }

}



private String _nombre;



public String Nombre

{

get { return _nombre; }

set { _nombre = value; }

}



public Mesa() { }



public Mesa(String nombre, tipoTabla tabla, tipoPata TipoPata, Int32 CantidadPatas)

{

this.Nombre = nombre;



this.Tabla = new tabla(tabla);



Pata[] wPatas = new Pata[CantidadPatas];



for (int i = 0; i < CantidadPatas; i++)

{

wPatas[i] = new Pata(TipoPata);

}



this.Patas = wPatas;

}



public override string ToString()

{

String r = Nombre + " => " + Tabla.Tipo.ToString();

Int32 i = 1;

foreach (Pata p in Patas)

{

r = r + " Pata " + i.ToString() + ": " + p.Tipo.ToString();

i++;

}

return r;

}



}



public abstract class CarpinteriaFactory

{

abstract public Mueble crearMueble();

}





public class MesaAntiguaFactory : CarpinteriaFactory

{

public override Mueble crearMueble()

{

return new Mesa("Mesa Antigua", tipoTabla.Cuadrada, tipoPata.Cuadrada, 4);

}

}



public class MesaExoticaFactory : CarpinteriaFactory

{

public override Mueble crearMueble()

{

Mesa exotica = new Mesa("Mesa Exótica", tipoTabla.Ovalada, tipoPata.Redonda, 4);

exotica.Patas[1].Tipo = tipoPata.Cuadrada;

exotica.Patas[3].Tipo = tipoPata.Cuadrada;

return exotica;

}

}



public class MesaModernaFactory : CarpinteriaFactory

{

public override Mueble crearMueble()

{

return new Mesa("Mesa Moderna", tipoTabla.Redonda, tipoPata.Redonda, 3);

}

}



}


Como pueden ver existen las clases pata y tabla que tienen propiedades cada una que definen su ámbito.


Luego existe una clase mueble que por el momento no tiene nada pero que se podría anexar funcionalidad.


La clase mesa hereda de mueble y se compone de una tabla y un array de patas, además de un nombre.


Luego existe la clase abstracta carpinteriaFactory que define el método publico crearMueble.


Por último existen tres implementaciones de carpinteríaFactory: MesaExoticaFactory,MesaAntiguaFactory y MesaModernaFactory.


Estas clases instancian la clase mesa, crear todos los objetos necesarios y asignan valores a sus propiedades.


De esta forma se pueden obtener objetos complejos y encapsular su instanciación. Les dejo el esquema del patrón:




No hay comentarios.: