Wzorzec projektowy - abstrakcyjny wzór fabryczny

Wzory abstrakcyjnej fabryki działają wokół superfabryki, która tworzy inne fabryki. Ta fabryka jest również nazywana fabryką fabryk. Ten typ wzorca projektowego wchodzi w zakres wzorca kreacyjnego, ponieważ ten wzorzec zapewnia jeden z najlepszych sposobów tworzenia obiektu.

We wzorcu Abstract Factory interfejs jest odpowiedzialny za tworzenie fabryki powiązanych obiektów bez jawnego określania ich klas. Każda wygenerowana fabryka może nadać obiekty zgodnie ze wzorcem fabryki.

Realizacja

Mamy zamiar stworzyć interfejs Shape i konkretną klasę implementującą go. Jako kolejny krok tworzymy abstrakcyjną klasę fabryczną AbstractFactory. Zdefiniowano klasę fabryki ShapeFactory, która jest rozszerzeniem klasy AbstractFactory. Tworzona jest klasa FactoryProducer tworząca / generująca fabrykę.

AbstractFactoryPatternDemo, nasza klasa demonstracyjna używa FactoryProducer, aby uzyskać obiekt AbstractFactory. Przekaże informacje (CIRCLE / RECTANGLE / SQUARE dla Shape) do AbstractFactory, aby uzyskać typ obiektu, którego potrzebuje.

Krok 1

Utwórz interfejs dla kształtów.

Shape.java

public interface Shape {
   void draw();
}

Krok 2

Utwórz konkretne klasy implementujące ten sam interfejs.

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.");
   }
}

Krok 3

Utwórz klasę abstrakcyjną, aby uzyskać fabryki dla obiektów o normalnym i zaokrąglonym kształcie.

AbstractFactory.java

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

Krok 4

Utwórz klasy Factory rozszerzające AbstractFactory w celu wygenerowania obiektu konkretnej klasy na podstawie podanych informacji.

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;
   }
}

Krok 5

Utwórz klasę generatora / producenta fabryki, aby uzyskać fabryki, przekazując informacje, takie jak Shape

FactoryProducer.java

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

Krok 6

Użyj FactoryProducer, aby uzyskać AbstractFactory w celu uzyskania fabryk konkretnych klas, przekazując informacje, takie jak typ.

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();
      
   }
}

Krok 7

Sprawdź dane wyjściowe.

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