logo

Factory-Methodenmuster

Ein Factory Pattern oder Factory Method Pattern sagt das genau Definieren Sie eine Schnittstelle oder abstrakte Klasse zum Erstellen eines Objekts, aber lassen Sie die Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit anderen Worten: Unterklassen sind dafür verantwortlich, die Instanz der Klasse zu erstellen.

Das Factory-Methodenmuster ist auch bekannt als Virtueller Konstrukteur.

Vorteil des Factory Design Patterns

  • Mit Factory Method Pattern können die Unterklassen den Typ der zu erstellenden Objekte auswählen.
  • Es fördert die lose Kopplung indem die Notwendigkeit entfällt, anwendungsspezifische Klassen in den Code einzubinden. Das bedeutet, dass der Code ausschließlich mit der resultierenden Schnittstelle oder abstrakten Klasse interagiert, sodass er mit allen Klassen funktioniert, die diese Schnittstelle implementieren oder diese abstrakte Klasse erweitern.

Verwendung von Factory Design Pattern

  • Wenn eine Klasse nicht weiß, welche Unterklassen erstellt werden müssen
  • Wenn eine Klasse möchte, dass ihre Unterklassen die zu erstellenden Objekte angeben.
  • Wenn die übergeordnete Klasse die Erstellung von Objekten für ihre Unterklassen auswählt.

UML für Factory Method Pattern

  • Wir werden eine abstrakte Plan-Klasse und konkrete Klassen erstellen, die die abstrakte Plan-Klasse erweitern. Als nächster Schritt wird eine Factory-Klasse GetPlanFactory definiert.
  • Die GenerateBill-Klasse verwendet GetPlanFactory, um ein Plan-Objekt abzurufen. Es werden Informationen (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) an GetPalnFactory übergeben, um den benötigten Objekttyp zu erhalten.

Stromrechnung berechnen: Ein reales Beispiel einer Fabrikmethode

Schritt 1: Erstellen Sie eine abstrakte Planklasse.

 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. 

Schritt 2: Erstellen Sie die konkreten Klassen, die die abstrakte Klasse Plan erweitern.

 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. 

Schritt 3: Erstellen Sie eine GetPlanFactory, um Objekte konkreter Klassen basierend auf den angegebenen Informationen zu generieren.

 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. 

Schritt 4: Generieren Sie Bill, indem Sie GetPlanFactory verwenden, um das Objekt konkreter Klassen abzurufen, indem Sie Informationen wie den Plantyp DOMESTICPLAN, COMMERCIALPLAN oder INSTITUTIONALPLAN übergeben.

 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. 

Laden Sie dieses Beispiel für eine Stromrechnung herunter

Ausgabe