Учебники

Шаблон дизайна — абстрактный шаблон фабрики

Абстрактные фабричные шаблоны работают вокруг суперфабрики, которая создает другие фабрики. Эта фабрика также называется фабрикой фабрик. Этот тип шаблона проектирования подпадает под шаблон создания, поскольку этот шаблон обеспечивает один из лучших способов создания объекта.

В шаблоне Abstract Factory интерфейс отвечает за создание фабрики связанных объектов без явного указания их классов. Каждая сгенерированная фабрика может давать объекты в соответствии с шаблоном фабрики.

Реализация

Мы собираемся создать интерфейсы Shape и Color и конкретные классы, реализующие эти интерфейсы. В качестве следующего шага мы создадим абстрактный фабричный класс AbstractFactory . Фабричные классы ShapeFactory и ColorFactory определяются там, где каждая фабрика расширяет AbstractFactory . Создатель фабрики / генератор класса FactoryProducer создан.

AbstractFactoryPatternDemo , наш демонстрационный класс использует FactoryProducer для получения объекта AbstractFactory . Он будет передавать информацию ( CIRCLE / RECTANGLE / SQUARE для Shape ) в AbstractFactory для получения нужного типа объекта. Он также передает информацию ( RED / GREEN / BLUE для Color ) в AbstractFactory для получения нужного типа объекта.

Абстрактная фабричная модель UML-диаграммы

Шаг 1

Создайте интерфейс для форм и цветов.

Shape.java

public interface Shape {
   void draw();
}

Шаг 2

Создайте конкретные классы, реализующие тот же интерфейс.

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

Шаг 3

Создайте абстрактный класс, чтобы получить фабрики для объектов нормальной и округлой формы.

AbstractFactory.java

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

Шаг 4

Создать классы Factory, расширяющие AbstractFactory для генерации объекта конкретного класса на основе заданной информации.

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

Шаг 5

Создайте класс генератора / производителя фабрики, чтобы получить фабрики, передавая информацию, такую ​​как форма

FactoryProducer.java

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

Шаг 6

Используйте FactoryProducer для получения AbstractFactory, чтобы получить фабрики конкретных классов, передавая информацию, такую ​​как тип.

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {
      //get rounded shape factory
      AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
      //get an object of Shape Rounded Rectangle
      Shape shape1 = shapeFactory.getShape("RECTANGLE");
      //call draw method of Shape Rectangle
      shape1.draw();
      //get an object of Shape Rounded Square 
      Shape shape2 = shapeFactory.getShape("SQUARE");
      //call draw method of Shape Square
      shape2.draw();
      //get rounded 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();
      
   }
}

Шаг 7

Проверьте вывод.