Mô hình thiết kế - Mô hình nhà máy trừu tượng

Các mẫu nhà máy trừu tượng hoạt động xung quanh một siêu nhà máy tạo ra các nhà máy khác. Nhà máy này còn được gọi là nhà máy của các nhà máy. Loại mẫu thiết kế này thuộc mẫu sáng tạo vì mẫu này cung cấp một trong những cách tốt nhất để tạo một đối tượng.

Trong mẫu Abstract Factory, một giao diện chịu trách nhiệm tạo một nhà máy của các đối tượng liên quan mà không chỉ định rõ ràng các lớp của chúng. Mỗi nhà máy được tạo có thể cung cấp các đối tượng theo mẫu Nhà máy.

Thực hiện

Chúng ta sẽ tạo một giao diện Shape và một lớp cụ thể triển khai nó. Chúng ta tạo một lớp nhà máy trừu tượng AbstractFactory như bước tiếp theo. Lớp nhà máy ShapeFactory được định nghĩa, mở rộng AbstractFactory. Một lớp tạo nhà máy / trình tạo FactoryProductioner được tạo.

AbstractFactoryPatternDemo, lớp demo của chúng ta sử dụng FactoryProductioner để lấy một đối tượng AbstractFactory. Nó sẽ chuyển thông tin (CIRCLE / RECTANGLE / SQUARE cho Shape) đến AbstractFactory để lấy loại đối tượng mà nó cần.

Bước 1

Tạo giao diện cho Shapes.

Shape.java

public interface Shape {
   void draw();
}

Bước 2

Tạo các lớp cụ thể triển khai cùng một giao diện.

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

Bước 3

Tạo một lớp Trừu tượng để lấy các nhà máy cho các Đối tượng Hình dạng Thường và Hình tròn.

AbstractFactory.java

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

Bước 4

Tạo các lớp Factory mở rộng AbstractFactory để tạo đối tượng của lớp cụ thể dựa trên thông tin đã cho.

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

Bước 5

Tạo một lớp Nhà máy sản xuất / nhà sản xuất để nhận các nhà máy bằng cách chuyển một thông tin như Hình dạng

FactoryProductioner.java

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

Bước 6

Sử dụng FactoryProductioner để lấy AbstractFactory để lấy các nhà máy của các lớp cụ thể bằng cách chuyển một thông tin như kiểu.

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

Bước 7

Xác minh kết quả đầu ra.

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