Modèle de conception - modèle d'usine abstraite

Les modèles d'usine abstraite fonctionnent autour d'une super-usine qui crée d'autres usines. Cette usine est également appelée usine d'usines. Ce type de modèle de conception fait partie du modèle de création car ce modèle fournit l'un des meilleurs moyens de créer un objet.

Dans le modèle Abstract Factory, une interface est responsable de la création d'une fabrique d'objets associés sans spécifier explicitement leurs classes. Chaque usine générée peut donner les objets selon le modèle Factory.

la mise en oeuvre

Nous allons créer une interface Shape et une classe concrète l'implémentant. Nous créons une classe de fabrique abstraite AbstractFactory comme étape suivante. La classe Factory ShapeFactory est définie, ce qui étend AbstractFactory. Une classe de créateur / générateur d'usine FactoryProducer est créée.

AbstractFactoryPatternDemo, notre classe de démonstration utilise FactoryProducer pour obtenir un objet AbstractFactory. Il transmettra des informations (CIRCLE / RECTANGLE / SQUARE pour Shape) à AbstractFactory pour obtenir le type d'objet dont il a besoin.

Étape 1

Créez une interface pour les formes.

Shape.java

public interface Shape {
   void draw();
}

Étape 2

Créez des classes concrètes mettant en œuvre la même 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.");
   }
}

Étape 3

Créez une classe abstraite pour obtenir des usines pour les objets de forme normale et arrondie.

AbstractFactory.java

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

Étape 4

Créez des classes Factory étendant AbstractFactory pour générer un objet de classe concrète basé sur des informations données.

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

Étape 5

Créez un générateur / classe de producteur d'usine pour obtenir des usines en transmettant une information telle que Shape

FactoryProducer.java

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

Étape 6

Utilisez FactoryProducer pour obtenir AbstractFactory afin d'obtenir des fabriques de classes concrètes en passant une information telle que type.

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

Étape 7

Vérifiez la sortie.

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