logo

Patrón de método de fábrica

Un patrón de fábrica o patrón de método de fábrica dice que solo Defina una interfaz o clase abstracta para crear un objeto, pero deje que las subclases decidan qué clase crear una instancia. En otras palabras, las subclases son responsables de crear la instancia de la clase.

El patrón del método de fábrica también se conoce como Constructores virtuales.

Ventaja del patrón de diseño de fábrica

  • Factory Method Pattern permite a las subclases elegir el tipo de objetos a crear.
  • Promueve la bajo acoplamiento eliminando la necesidad de vincular clases específicas de la aplicación al código. Eso significa que el código interactúa únicamente con la interfaz o clase abstracta resultante, de modo que funcionará con cualquier clase que implemente esa interfaz o que extienda esa clase abstracta.

Uso del patrón de diseño de fábrica

  • Cuando una clase no sabe qué subclases serán necesarias para crear
  • Cuando una clase quiere que sus subclases especifiquen los objetos a crear.
  • Cuando las clases principales eligen la creación de objetos para sus subclases.

UML para patrón de método de fábrica

  • Vamos a crear una clase abstracta Plan y clases concretas que extiendan la clase abstracta Plan. Como siguiente paso se define una clase de fábrica GetPlanFactory.
  • La clase GenerateBill utilizará GetPlanFactory para obtener un objeto Plan. Pasará información (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) a GetPalnFactory para obtener el tipo de objeto que necesita.

Calcular la factura de electricidad: un ejemplo del mundo real de método de fábrica

Paso 1: Crea una clase abstracta 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. 

Paso 2: Cree las clases concretas que extienden la clase abstracta 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. 

Paso 3: Cree un GetPlanFactory para generar objetos de clases concretas basadas en la información proporcionada.

arp - un comando
 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. 

Etapa 4: Genere Bill utilizando GetPlanFactory para obtener el objeto de clases concretas pasando una información como el tipo de plan DOMESTICPLAN o COMMERCIALPLAN o INSTITUTIONALPLAN.

 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. 

descarga este ejemplo de factura de electricidad

Producción