Tovární vzor nebo vzor tovární metody říká, že právě definovat rozhraní nebo abstraktní třídu pro vytvoření objektu, ale nechat podtřídy rozhodnout, kterou třídu vytvoří. Jinými slovy, podtřídy jsou odpovědné za vytvoření instance třídy.
Vzor tovární metody je také známý jako Virtuální konstruktor.
Výhoda továrního návrhového vzoru
- Vzor továrních metod umožňuje podtřídám vybrat si typ objektů, které mají vytvořit.
- Propaguje to volné spojení odstraněním potřeby vázat třídy specifické pro aplikaci do kódu. To znamená, že kód interaguje pouze s výsledným rozhraním nebo abstraktní třídou, takže bude fungovat se všemi třídami, které implementují toto rozhraní nebo které tuto abstraktní třídu rozšiřují.
Použití továrního návrhového vzoru
- Když třída neví, jaké podtřídy bude potřeba vytvořit
- Když třída chce, aby její podtřídy specifikovaly objekty, které mají být vytvořeny.
- Když rodičovské třídy zvolí vytváření objektů do svých podtříd.
UML pro vzor tovární metody
- Vytvoříme abstraktní třídu Plan a konkrétní třídy, které rozšíří abstraktní třídu Plan. Jako další krok je definována tovární třída GetPlanFactory.
- Třída GenerateBill použije GetPlanFactory k získání objektu Plan. Předá informace (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) GetPalnFactory, aby získala typ objektu, který potřebuje.
Vypočítat účet za elektřinu: Příklad tovární metody v reálném světě
Krok 1: Vytvořte abstraktní třídu 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.
Krok 2: Vytvořte konkrétní třídy, které rozšiřují abstraktní třídu 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.
Krok 3: Vytvořte GetPlanFactory pro generování objektu konkrétních tříd na základě daných informací.
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.
Krok 4: Generujte Bill pomocí GetPlanFactory, abyste získali objekt konkrétních tříd předáním informací, jako je typ plánu DOMESTICPLAN nebo COMMERCIALPLAN nebo 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.
stáhněte si tento příklad účtu za elektřinu