José Jorge Márquez Gómez

Patró Factoria (Factory)

by on ago.27, 2010, under Donet

Un patró factoria ens serveix per canalitzar totes les creacions d'objectes en un sol punt. Això és útil per a un disseny robust del nostre sistema i àgil al canvi.

El patró factoria es pot combinar amb el patró Singleton ja que és més còmode el seu ús i útil la seva forma d'utilitzar. En aquest exemple posarem un factoria sense Singleton.

Dir que el patró factoria és del tipus patrons creacionals, que aquest tipus de patró abstreu la manera de crear objectes concrets, donant així un suport per crear objectes de forma abstracta.

Per començar un patró factoria ha de complir:
- Una funció o mètode el qual s'encarrega de crear objectes d'un tipus donat.
- No és obligatori però si recomanable que aquesta funció o mètode retorni una abstracció (interfície o classe abstracta).

Imaginem que una botiga de pizzes requereix d'un programari que necessita que tinguin una sèrie de productes (pizzes variades). Com a bons dissenyadors que som, la creació d'objectes de pizzes es podrà fer des de qualsevol part el projecte, però el problema és que hi ha molts tipus de pizzes. El crear cada pizza de cada tipus en diferents punts del programa seria el primer que pensaríem, però ... si en comptes d'això fem servir sentit comú i apliquem el factoria?, Això ens permetria que donat un nou producte o un canvi en algun d'ells , que només canviem en un sol lloc, tenint més controlat aquest codi. Fins i tot si us adoneu l'agilitat al canvi és molt més gran que anar canviant totes les possibles aparicions de les nostres pizzes pel codi.
Doncs bé, el factoria s'encarregaria de crear tot tipus de pizzes i les oferiria a tots els possibles punts del programa.

El nostre exemple seria el següent:

- La interfície IPizza:

     interfície IPizza
     {
         void quienSoy ();
     }

- Les pizzes concretes:

     public class PizzaBarbacoa: IPizza
     {
         # Region Membres de IPizza

         public void quienSoy ()
         {
             Console.WriteLine ("Sóc una pizza de Barbacoa");
         }

         # Endregion
     }
     public class PizzaMargarita: IPizza
     {
         # Region Membres de IPizza

         public void quienSoy ()
         {
             Console.WriteLine ("Sóc una pizza de Margarida");
         }

         # Endregion
     }
     public class PizzaPepperoni: IPizza
     {
         # Region Membres de IPizza

         public void quienSoy ()
         {
             Console.WriteLine ("Sóc una pizza de Pepperoni");
         }

         # Endregion
     }

- La factoria en qüestió:

     public class PizzaFactory
     {
         public enum tipoPizza
         {
             Pepperoni, Margarita, Barbacoa
         }

         public IPizza getPizza (tipoPizza tipus)
         {
             switch (tipus)
             {
                 case tipoPizza.Barbacoa:
                     return new PizzaBarbacoa ();
                     break;
                 case tipoPizza.Margarita:
                     return new PizzaMargarita ();
                     break;
                 case tipoPizza.Pepperoni:
                     return new PizzaPepperoni ();
                     break;
                 default:
                     return new PizzaBarbacoa ();
             }
         }
     }

- Un petit test:

     public class Test
     {
         public void testPizza ()
         {
             / / Exemple no usant factoria
             IPizza pizza1 = new PizzaBarbacoa ();
             pizza1.quienSoy ();
             IPizza pizza2 = new PizzaMargarita ();
             pizza2.quienSoy ();
             IPizza pizza3 = new PizzaPepperoni ();
             pizza3.quienSoy ();
             IPizza pizza4 = new PizzaBarbacoa ();
             pizza4.quienSoy ();
             IPizza pizza5 = new PizzaMargarita ();
             pizza5.quienSoy ();

             / / Exemple usant factoria
             PizzaFactory factory = new PizzaFactory ();
             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 ();
         }
     }

Com veieu la forma d'ús i els seus avantatges són millors. Espero que us serveixi!!. Fins ara!

: , , ,

Deixa un comentari

Imagen CAPTCHA
Refresh Image
*

Busques alguna cosa?

Utilitzeu el formulari següent per buscar en el lloc:

Encara no ha trobat el que estàs buscant? Deixeu un comentari o contacta amb nosaltres per encarregar.

Visita els nostres amics!

Uns llocs molt recomanables ...

Arxiu

Totes les entrades, cronològicament ...