logo

Patró del mètode de fàbrica

Un patró de fàbrica o un patró de mètode de fàbrica només ho diu definiu una interfície o classe abstracta per crear un objecte, però deixeu que les subclasses decideixin quina classe crear una instancia. En altres paraules, les subclasses són les responsables de crear la instància de la classe.

El patró del mètode de fàbrica també es coneix com Constructor virtual.

Avantatge del patró de disseny de fàbrica

  • Factory Method Pattern permet a les subclasses triar el tipus d'objectes a crear.
  • Fomenta el acoblament solt eliminant la necessitat d'unir classes específiques de l'aplicació al codi. Això vol dir que el codi interactua únicament amb la interfície o classe abstracta resultant, de manera que funcionarà amb qualsevol classe que implementi aquesta interfície o que ampliï aquesta classe abstracta.

Ús del patró de disseny de fàbrica

  • Quan una classe no sap quines subclasses caldrà crear
  • Quan una classe vol que les seves subclasses especifiquen els objectes a crear.
  • Quan les classes pares trien la creació d'objectes a les seves subclasses.

UML per al patró del mètode de fàbrica

  • Crearem una classe abstracta de Plan i classes concretes que amplia la classe abstracta de Plan. Una classe de fàbrica GetPlanFactory es defineix com a pas següent.
  • La classe GenerateBill utilitzarà GetPlanFactory per obtenir un objecte Plan. Passarà informació (PLAN DOMESTIC / PLA COMERCIAL / PLA INSTITUCIONAL) a GetPalnFactory per obtenir el tipus d'objecte que necessita.

Calcular la factura elèctrica: un exemple real del mètode de fàbrica

Pas 1: Crear una classe d'abstract de Plan.

 import java.io.*; abstract class Plan{ protected double rate; abstract void getRate(); public void calculateBill(int units){ System.out.println(units*rate); } }//end of Plan class. 

Pas 2: Creeu les classes concretes que amplia la classe abstracta de Plan.

 class DomesticPlan extends Plan{ //@override public void getRate(){ rate=3.50; } }//end of DomesticPlan class. 
 class CommercialPlan extends Plan{ //@override public void getRate(){ rate=7.50; } }//end of CommercialPlan class. 
 class InstitutionalPlan extends Plan{ //@override public void getRate(){ rate=5.50; } }//end of InstitutionalPlan class. 

Pas 3: Creeu un GetPlanFactory per generar objecte de classes concretes basades en la informació donada.

 class GetPlanFactory{ //use getPlan method to get object of type Plan public Plan getPlan(String planType){ if(planType == null){ return null; } if(planType.equalsIgnoreCase('DOMESTICPLAN')) { return new DomesticPlan(); } else if(planType.equalsIgnoreCase('COMMERCIALPLAN')){ return new CommercialPlan(); } else if(planType.equalsIgnoreCase('INSTITUTIONALPLAN')) { return new InstitutionalPlan(); } return null; } }//end of GetPlanFactory class. 

Pas 4: Genereu Bill utilitzant el GetPlanFactory per obtenir l'objecte de classes concretes passant una informació com el tipus de pla DOMESTICPLAN o COMMERCIALPLAN o INSTITUTIONALPLAN.

gzip per a Linux
 import java.io.*; class GenerateBill{ public static void main(String args[])throws IOException{ GetPlanFactory planFactory = new GetPlanFactory(); System.out.print('Enter the name of plan for which the bill will be generated: '); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String planName=br.readLine(); System.out.print('Enter the number of units for bill will be calculated: '); int units=Integer.parseInt(br.readLine()); Plan p = planFactory.getPlan(planName); //call getRate() method and calculateBill()method of DomesticPaln. System.out.print('Bill amount for '+planName+' of '+units+' units is: '); p.getRate(); p.calculateBill(units); } }//end of GenerateBill class. 

descarregueu aquest exemple de factura d'electricitat

Sortida