Un modello di fabbrica o un modello di metodo di fabbrica dice proprio questo definire un'interfaccia o una classe astratta per creare un oggetto ma lasciare che siano le sottoclassi a decidere quale classe istanziare. In altre parole, le sottoclassi sono responsabili della creazione dell'istanza della classe.
Il modello del metodo Factory è anche noto come Costruttore virtuale.
Vantaggio del modello di progettazione di fabbrica
- Factory Method Pattern consente alle sottoclassi di scegliere il tipo di oggetti da creare.
- Promuove il accoppiamento lasco eliminando la necessità di associare classi specifiche dell'applicazione nel codice. Ciò significa che il codice interagisce esclusivamente con l'interfaccia risultante o la classe astratta, in modo che funzioni con qualsiasi classe che implementi quell'interfaccia o che estenda quella classe astratta.
Utilizzo del modello di progettazione di fabbrica
- Quando una classe non sa quali sottoclassi dovrà creare
- Quando una classe vuole che le sue sottoclassi specifichino gli oggetti da creare.
- Quando le classi madri scelgono la creazione di oggetti nelle sue sottoclassi.
UML per modello del metodo di fabbrica
- Creeremo una classe astratta Plan e classi concrete che estendono la classe astratta Plan. Come passaggio successivo viene definita una classe factory GetPlanFactory.
- La classe GenerateBill utilizzerà GetPlanFactory per ottenere un oggetto Plan. Passerà le informazioni (PIANO DOMESTICO / PIANO COMMERCIALE / PIANO ISTITUZIONALE) a GetPalnFactory per ottenere il tipo di oggetto di cui ha bisogno.
Calcolare la bolletta elettrica: un esempio reale del metodo di fabbrica
Passo 1: Creare una classe astratta 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: Crea le classi concrete che estendono la classe astratta 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.
Passaggio 3: Crea una GetPlanFactory per generare oggetti di classi concrete in base alle informazioni fornite.
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.
Passaggio 4: Genera fattura utilizzando GetPlanFactory per ottenere l'oggetto di classi concrete passando informazioni come il tipo di piano 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.
scarica questo esempio di bolletta elettrica