Java >> Java Tutorial >  >> Java

Entwurfsmuster – Abstraktes Fabrikmuster – Teil IV

In der Fortsetzung der Reihe von Designmustern haben wir Einführung, Singleton-Muster und Factory-Muster behandelt. Im aktuellen Beitrag behandeln wir die nächste kreative Art von Designmustern und das ist Abstraktes Designmuster .

Was ist also ein abstraktes Fabrikmuster?

Es ist eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne dass der Kunde die Implementierungsdetails kennt.

Unterschied zwischen abstraktem Fabrikmuster und Fabrikmuster

Erstens besteht ein gemeinsames Thema zwischen diesen beiden Mustern darin, dass sie das Client-System von Implementierungsdetails entkoppeln.

  • Fabrikmuster erstellt Objekt durch Vererbung.
  • Abstraktes Fabrikmuster schafft Objekt durch Komposition.
  • Abstract Factory bietet eine Schnittstelle, um eine Familie verwandter Objekte zu erstellen.
  • Fabrikmuster, auch bekannt als Fabrikmethodenmuster, wird in Unterklassen vererbt, um konkrete Objekte zu erstellen.

Im vorherigen Beitrag haben wir ein Schnittstellen-Fahrzeug  gesehen implementiert durch verschiedene Klassen Auto, Bus, Motorrad, LKW und eine Klasse VehicleFactory gab verschiedene Klassen zurück.

Ebenso bietet das abstrakte Fabrikmuster eine Abstraktionsschicht über dem normalen Fabrikmuster. Dabei isoliert sie Fabriken. Das Muster gibt Fabriken verwandter Objekte zurück. Wenn ich also ein Auto von Toyoto-Typen haben möchte, kann es mir Fabriken von Camry, Corolla, Avalanche usw. zurückgeben.

Um das Abstrakte-Fabrik-Muster zu zeigen, erstellen wir daher eine abstrakte Klasse, die den Kilometerstand des Autos zurückgibt. Dies sieht wie folgt aus:

public abstract class CarMileage 
{
   protected double distance;
   protected double gas;

   public abstract void getCarMileage(double dist, double gasfilled);

   public void calculateCarMileage(double dist, double gasfilled) 
   {
     double carmileage = dist / gasfilled;
     System.out.println(" Your car mileage is " + carmileage);
   }
}

Jetzt wird jede zugehörige konkrete Klasse diese Klasse erweitern, um uns den Kilometerstand des Autos zurückzugeben. Wir werden Camry, Corolla und Avalanche als verschiedene Autos vom Typ Toyota haben. Als Teil dieses Musters fügen wir jedoch eine abstrakte Klasse hinzu, die mir Fabriken mit Autokilometern zurückgibt. Dies wird wie folgt angezeigt:

public abstract class AbstractFactory 
{
   public abstract CarMileage getCarMileage(String car);
}

Eine konkrete Unterklasse CarFactory von AbstractFactory gibt uns basierend auf dem von uns übergebenen Autonamen unterschiedliche Autokilometer zurück.

public class CarFactory extends AbstractFactory 
{

  @Override
  public CarMileage getCarMileage(String car) 
  {

     if (car == null || car.equals("")) 
     {
       return null;
     } 
     if (car.equalsIgnoreCase("camry")) 
     {
       return new CamryCarMileage();
     } 
     else if (car.equalsIgnoreCase("corolla")) 
     {
       return new CorollaCarMileage();
     } 
     else if (car.equalsIgnoreCase("avalanche")) 
     {
       return new AvalanceCarMileage();
     }
     return null;
  }

}

Um dies zu demonstrieren, indem eine Client-Klasse implementiert wird, die den Benutzer nach Fahrzeugname, zurückgelegter Entfernung und gefülltem Benzin fragt. Basierend auf Carname wird AbstractFactory uns eine Fabrik für CarMileage zurückgeben. Diese CarMileage-Fabrik gibt uns die berechnete Automeilenzahl für dieses Auto zurück.

public class AbstractFactoryPatternDemo 
{
   public static void main(String[] args) throws IOException 
   {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      System.out.println(" Enter the car name you want mileage for: ");
      String carname = br.readLine();
      System.out.println("\n");
      System.out.println("Enter the distance covered: ");

      String distanceStr = br.readLine();
      double distance = Double.parseDouble(distanceStr);
      System.out.println("\n");
      System.out.println("Enter the gas you had filled: ");
      System.out.println("\n");
      String gasStr = br.readLine();
      double gas = Double.parseDouble(gasStr);

      AbstractFactory af = FactoryCreator.getFactory();
      CarMileage cm = af.getCarMileage(carname);

      cm.getCarMileage(distance, gas);

   }

}

Abschließend haben wir gezeigt, wie abstrakte Fabrikmuster verwendet werden können. Wenn wir eine Familie verwandter Objekte erstellen möchten, ohne jedoch ihre konkreten Unterklassen anzugeben , das ist unser bevorzugtes Muster.

Herunterladen

Der Code für diesen Beitrag ist verfügbar github repo.


Java-Tag