Design Pattern - Abstract Factory Pattern

Os padrões abstratos de fábrica funcionam em torno de uma super-fábrica que cria outras fábricas. Esta fábrica também é chamada de fábrica de fábricas. Esse tipo de padrão de design está incluído no padrão de criação, pois esse padrão fornece uma das melhores maneiras de criar um objeto.

No padrão Abstract Factory, uma interface é responsável por criar uma fábrica de objetos relacionados sem especificar explicitamente suas classes. Cada fábrica gerada pode fornecer os objetos de acordo com o padrão Factory.

Implementação

Vamos criar uma interface Shape e uma classe concreta para implementá-la. Criamos uma classe de fábrica abstrata AbstractFactory como a próxima etapa. A classe de fábrica ShapeFactory é definida, o que estende AbstractFactory. Um criador de fábrica / classe gerador FactoryProducer é criado.

AbstractFactoryPatternDemo, nossa classe de demonstração usa FactoryProducer para obter um objeto AbstractFactory. Ele irá passar informações (CIRCLE / RECTANGLE / SQUARE para Shape) para AbstractFactory para obter o tipo de objeto de que precisa.

Passo 1

Crie uma interface para Shapes.

Shape.java

public interface Shape {
   void draw();
}

Passo 2

Crie classes concretas implementando a mesma interface.

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

etapa 3

Crie uma classe Abstract para obter fábricas para objetos de forma normal e arredondada.

AbstractFactory.java

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

Passo 4

Crie classes Factory estendendo AbstractFactory para gerar objeto de classe concreta com base nas informações fornecidas.

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

Etapa 5

Crie uma classe de gerador / produtor de fábrica para obter fábricas passando uma informação como Forma

FactoryProducer.java

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

Etapa 6

Use o FactoryProducer para obter AbstractFactory a fim de obter fábricas de classes concretas, passando uma informação como tipo.

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

Etapa 7

Verifique a saída.

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