Entwurfsmuster - Abstraktes Fabrikmuster

Abstrakte Fabrikmuster arbeiten um eine Superfabrik herum, die andere Fabriken schafft. Diese Fabrik wird auch als Fabrik der Fabriken bezeichnet. Diese Art von Entwurfsmuster fällt unter das Erstellungsmuster, da dieses Muster eine der besten Möglichkeiten zum Erstellen eines Objekts bietet.

Im Abstract Factory-Muster ist eine Schnittstelle dafür verantwortlich, eine Factory verwandter Objekte zu erstellen, ohne deren Klassen explizit anzugeben. Jede generierte Factory kann die Objekte gemäß dem Factory-Muster angeben.

Implementierung

Wir werden eine Shape-Schnittstelle erstellen und eine konkrete Klasse implementieren. Als nächsten Schritt erstellen wir eine abstrakte Factory-Klasse AbstractFactory. Es ist die Factory-Klasse ShapeFactory definiert, die AbstractFactory erweitert. Eine Factory Creator / Generator-Klasse FactoryProducer wird erstellt.

AbstractFactoryPatternDemo, unsere Demo-Klasse, verwendet FactoryProducer, um ein AbstractFactory-Objekt abzurufen. Es werden Informationen (CIRCLE / RECTANGLE / SQUARE for Shape) an AbstractFactory übergeben, um den gewünschten Objekttyp zu erhalten.

Schritt 1

Erstellen Sie eine Schnittstelle für Formen.

Shape.java

public interface Shape {
   void draw();
}

Schritt 2

Erstellen Sie konkrete Klassen, die dieselbe Schnittstelle implementieren.

RoundedRectangle.java

public class RoundedRectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside RoundedRectangle::draw() method.");
   }
}

RoundedSquare.java

public class RoundedSquare implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside RoundedSquare::draw() method.");
   }
}

Rectangle.java

public class Rectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Schritt 3

Erstellen Sie eine abstrakte Klasse, um Fabriken für Objekte mit normaler und abgerundeter Form abzurufen.

AbstractFactory.java

public abstract class AbstractFactory {
   abstract Shape getShape(String shapeType) ;
}

Schritt 4

Erstellen Sie Factory-Klassen, die AbstractFactory erweitern, um basierend auf den angegebenen Informationen ein Objekt einer konkreten Klasse zu generieren.

ShapeFactory.java

public class ShapeFactory extends AbstractFactory {
   @Override
   public Shape getShape(String shapeType){    
      if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }	 
      return null;
   }
}

RoundedShapeFactory.java

public class RoundedShapeFactory extends AbstractFactory {
   @Override
   public Shape getShape(String shapeType){    
      if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new RoundedRectangle();         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new RoundedSquare();
      }	 
      return null;
   }
}

Schritt 5

Erstellen Sie eine Factory-Generator- / Produzentenklasse, um Fabriken zu erhalten, indem Sie Informationen wie Shape übergeben

FactoryProducer.java

public class FactoryProducer {
   public static AbstractFactory getFactory(boolean rounded){   
      if(rounded){
         return new RoundedShapeFactory();         
      }else{
         return new ShapeFactory();
      }
   }
}

Schritt 6

Verwenden Sie den FactoryProducer, um AbstractFactory abzurufen und Fabriken konkreter Klassen durch Übergabe von Informationen wie type abzurufen.

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {
      //get shape factory
      AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
      //get an object of Shape Rectangle
      Shape shape1 = shapeFactory.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape1.draw();
      //get an object of Shape Square 
      Shape shape2 = shapeFactory.getShape("SQUARE");
      //call draw method of Shape Square
      shape2.draw();
      //get shape factory
      AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
      //get an object of Shape Rectangle
      Shape shape3 = shapeFactory1.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape3.draw();
      //get an object of Shape Square 
      Shape shape4 = shapeFactory1.getShape("SQUARE");
      //call draw method of Shape Square
      shape4.draw();
      
   }
}

Schritt 7

Überprüfen Sie die Ausgabe.

Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.