A gyári minta vagy a gyári módszer minta azt mondja, hogy csak definiáljon interfészt vagy absztrakt osztályt egy objektum létrehozásához, de hagyja, hogy az alosztályok döntsék el, melyik osztályt példányosítják. Más szavakkal, az alosztályok felelősek az osztály példányának létrehozásáért.
A gyári módszer minta más néven Virtuális Konstruktor.
A gyári tervezési minta előnyei
- A Factory Method Pattern lehetővé teszi az alosztályok számára a létrehozandó objektumok típusának kiválasztását.
- Elősegíti a laza csatolás azáltal, hogy kiküszöböli az alkalmazás-specifikus osztályok kódba kötésének szükségességét. Ez azt jelenti, hogy a kód kizárólag az eredményül kapott interfésszel vagy absztrakt osztállyal működik együtt, így minden olyan osztállyal működik, amely megvalósítja az interfészt, vagy kiterjeszti az absztrakt osztályt.
A gyári tervezési minta használata
- Amikor egy osztály nem tudja, milyen alosztályokat kell létrehoznia
- Amikor egy osztály azt akarja, hogy az alosztályai határozzák meg a létrehozandó objektumokat.
- Amikor a szülő osztályok kiválasztják az objektumok létrehozását az alosztályaihoz.
UML a gyári módszer mintához
- Létrehozunk egy Plan absztrakt osztályt és konkrét osztályokat, amelyek kiterjesztik a Plan absztrakt osztályt. Következő lépésként a GetPlanFactory gyári osztálya van meghatározva.
- A GenerateBill osztály a GetPlanFactory alkalmazást használja a Plan objektum lekéréséhez. Információkat (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) továbbít a GetPalnFactory számára, hogy megkapja a szükséges objektumtípust.
Villanyszámla kiszámítása: Valós példa a gyári módszerre
1. lépés: Hozzon létre egy terv absztrakt osztályt.
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.
2. lépés: Hozzon létre konkrét osztályokat, amelyek kiterjesztik a Plan absztrakt osztályt.
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.
3. lépés: Hozzon létre egy GetPlanFactory-t, amely konkrét osztályokból álló objektumot generál a megadott információk alapján.
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.
4. lépés: Hozzon létre számlát a GetPlanFactory használatával, hogy megkapja a konkrét osztályok tárgyát egy olyan információ átadásával, mint például a terv típusa DOMESTICPLAN vagy COMMERCIALPLAN vagy 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.
töltse le ezt a villanyszámlás példát