Fábrica de modelos (de fábrica)
por Jose Jorge Marquez Gomez en ago.27, 2010, baixo DoNet
Un nivel de fábrica serve para canalizar todas as creacións de obxectos nun único punto. Isto é útil para deseño robusto do noso sistema e receptivo a cambios.
O nivel de fábrica pode combinarse co estándar Singleton, pois é máis cómodo de usar e de forma útil para usar. Neste exemplo, imos poñer unha fábrica sen Singleton.
Dicir que o nivel de fábrica é un dos patróns de creación, este tipo de estándar que abstrai o xeito de crear obxectos concretos, dando así soporte para crear obxectos no abstracto.
Para ter un nivel de fábrica é a realización de:
- A función ou método que é responsable da creación de obxectos dun determinado tipo.
- Non é obrigatorio, pero é recomendable que a función ou método retorna unha abstracción (interface ou clase abstracta).
Imaxina unha tenda de pizza require un software ten que ter un número de produtos (pizzas variadas). Como deseñadores que somos bos, a creación do obxecto de pizza pódese facer dende calquera lugar do proxecto, pero o problema é que hai moitos tipos de pizzas. Para crear cada pizza para cada tipo en distintas partes do programa sería o primeiro que podería pensar, pero ... en cambio, usa o sentido común e aplicar a fábrica?, Isto permite-nos como un novo produto ou modificación en calquera deles que o cambio en só un lugar, máis controlada este código. Mesmo se percibir a velocidade do cambio é moito máis que ir cambiando todas as aparencias posibles das nosas pizzas polo código.
Así, a fábrica sería responsable de crear todo tipo de pizzas e ofrecer todos os puntos posibles do programa.
O noso exemplo sería:
- O IPizza interface:
IPizza interface de
{
WhoAmI void ();
}
- As pizzas individuais:
public class PizzaBarbacoa: IPizza
{
# Membros Rexión IPizza
public void WhoAmI ()
{
Console.WriteLine ("Eu son unha pizza churrasco");
}
# Endregion
}
public class PizzaMargarita: IPizza {número de usuarios rexión public void IPizza WhoAmI () {Console.WriteLine ("Eu son un Margarita pizza");}} # endregion
public class PizzaPepperoni: IPizza
{
# Membros Rexión IPizza
public void WhoAmI ()
{
Console.WriteLine ("Eu son un Pepperoni pizza");
}
# Endregion
}
- A planta en cuestión:
public class PizzaFactory
{
public enum tipoPizza
{
Pepperoni, Margherita, Barbeque
}
IPizza público getPizza (tipo tipoPizza)
{
rede (tipo)
{
caso tipoPizza.Barbacoa:
return new PizzaBarbacoa ();
romper;
caso tipoPizza.Margarita:
return new PizzaMargarita ();
romper;
caso tipoPizza.Pepperoni:
return new PizzaPepperoni ();
romper;
default:
return new PizzaBarbacoa ();
}
}
}
- Un pequeno test:
public class Test {public void testPizza () {/ example / non utilizar fábrica PizzaBarbacoa IPizza pizza1 = new (); pizza1.quienSoy (); IPizza PizzaMargarita pizza2 = new (); pizza2.quienSoy (); IPizza PizzaPepperoni pizza3 = new ( ) pizza3.quienSoy (); IPizza PizzaBarbacoa pizza4 = new (); pizza4.quienSoy (); IPizza PizzaMargarita pizza5 = new (); pizza5.quienSoy () / example / fábrica usando PizzaFactory fábrica PizzaFactory = new (); IPizza pizza6 = factory.getPizza (PizzaFactory.tipoPizza.Barbacoa); pizza6.quienSoy (); IPizza pizza7 = factory.getPizza (PizzaFactory.tipoPizza.Margarita); pizza7.quienSoy (); IPizza pizza8 = factory.getPizza (PizzaFactory.tipoPizza. Pepperoni) pizza8.quienSoy ();}} Como podes ver como usar e as súas vantaxes son mellores. Espero que vós gusten!. Te vexo máis tarde!






