Um Padrão de Fábrica ou Padrão de Método de Fábrica diz que apenas defina uma interface ou classe abstrata para criar um objeto, mas deixe as subclasses decidirem qual classe instanciar. Em outras palavras, as subclasses são responsáveis por criar a instância da classe.
O padrão Factory Method também é conhecido como Construtor Virtual.
Vantagem do padrão de design de fábrica
- O Factory Method Pattern permite que as subclasses escolham o tipo de objetos a serem criados.
- Promove o acoplamento solto eliminando a necessidade de vincular classes específicas do aplicativo ao código. Isso significa que o código interage apenas com a interface ou classe abstrata resultante, de modo que funcionará com quaisquer classes que implementem essa interface ou que estendam essa classe abstrata.
Uso do padrão de design de fábrica
- Quando uma classe não sabe quais subclasses serão necessárias para criar
- Quando uma classe deseja que suas subclasses especifiquem os objetos a serem criados.
- Quando as classes pai optam pela criação de objetos para suas subclasses.
UML para padrão de método de fábrica
- Vamos criar uma classe abstrata Plan e classes concretas que estendem a classe abstrata Plan. Uma classe de fábrica GetPlanFactory é definida como a próxima etapa.
- A classe GenerateBill usará GetPlanFactory para obter um objeto Plan. Ele passará informações (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) para GetPalnFactory para obter o tipo de objeto necessário.
Calcule a conta de eletricidade: um exemplo real de método de fábrica
Passo 1: Crie uma classe abstrata 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.
Passo 2: Crie as classes concretas que estendem a classe abstrata 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.
Etapa 3: Crie um GetPlanFactory para gerar objetos de classes concretas com base nas informações fornecidas.
lobo vs raposa
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.
Passo 4: Gere Bill utilizando GetPlanFactory para obter o objeto de classes concretas passando uma informação como tipo de plano DOMESTICPLAN ou COMMERCIALPLAN ou 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.
baixe este exemplo de conta de luz