รูปแบบการออกแบบ - รูปแบบโรงงานนามธรรม

รูปแบบโรงงานนามธรรมทำงานรอบโรงงานขนาดใหญ่ซึ่งสร้างโรงงานอื่น ๆ โรงงานนี้เรียกอีกอย่างว่าโรงงานของโรงงาน รูปแบบการออกแบบประเภทนี้มาจากรูปแบบการสร้างสรรค์เนื่องจากรูปแบบนี้เป็นวิธีที่ดีที่สุดวิธีหนึ่งในการสร้างวัตถุ

ในรูปแบบ Abstract Factory อินเทอร์เฟซมีหน้าที่สร้างโรงงานของออบเจ็กต์ที่เกี่ยวข้องโดยไม่ระบุคลาสอย่างชัดเจน โรงงานที่สร้างขึ้นแต่ละแห่งสามารถให้วัตถุได้ตามรูปแบบโรงงาน

การนำไปใช้

เรากำลังจะสร้างอินเทอร์เฟซ Shape และคลาสที่เป็นรูปธรรมในการนำไปใช้ เราสร้าง AbstractFactory ระดับโรงงานนามธรรมเป็นขั้นตอนต่อไป มีการกำหนด ShapeFactory ระดับโรงงานซึ่งขยาย AbstractFactory ผู้สร้างโรงงาน / คลาสเครื่องกำเนิดไฟฟ้า FactoryProducer ถูกสร้างขึ้น

AbstractFactoryPatternDemo คลาสสาธิตของเราใช้ FactoryProducer เพื่อรับวัตถุ AbstractFactory มันจะส่งข้อมูล (วงกลม / รูปสี่เหลี่ยม / สี่เหลี่ยมสำหรับรูปร่าง) ไปยัง AbstractFactory เพื่อรับประเภทของวัตถุที่ต้องการ

ขั้นตอนที่ 1

สร้างอินเทอร์เฟซสำหรับ Shapes

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

สร้างคลาส Abstract เพื่อรับโรงงานสำหรับวัตถุรูปร่างปกติและกลม

AbstractFactory.java

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

ขั้นตอนที่ 4

สร้างคลาสโรงงานที่ขยาย 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

สร้างคลาสเครื่องกำเนิดไฟฟ้า / ผู้ผลิตโรงงานเพื่อรับโรงงานโดยส่งข้อมูลเช่น Shape

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

ขั้นตอนที่ 7

ตรวจสอบผลลัพธ์

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