รูปแบบการออกแบบโรงงานคืออะไร?

รูปแบบการออกแบบโรงงานคืออะไร?
ผู้อ่านเช่นคุณช่วยสนับสนุน MUO เมื่อคุณทำการซื้อโดยใช้ลิงก์บนเว็บไซต์ของเรา เราอาจได้รับค่าคอมมิชชั่นจากพันธมิตร อ่านเพิ่มเติม.

รูปแบบการออกแบบโรงงาน (หรือวิธีการโรงงาน) เชี่ยวชาญในการมอบหมายและการห่อหุ้ม รูปแบบนี้อนุญาตให้ซูเปอร์คลาสเลื่อนการสร้างอินสแตนซ์ไปยังคลาสย่อย นี่เป็นเพราะคลาสที่มีรูปแบบเมธอดโรงงานหลักนั้นเป็นนามธรรม





เวอร์ชันดั้งเดิมของเมธอดโรงงานถือว่าอยู่ในรูปของเมธอดที่ไม่ได้ใช้งาน เนื่องจากไม่รู้จักผลิตภัณฑ์ที่จะสร้างขึ้น วิธีการของโรงงานอาจรู้ว่ากำลังสร้างผลิตภัณฑ์บางอย่าง แต่ไม่ทราบลักษณะเฉพาะของผลิตภัณฑ์ที่จะสร้างขึ้น ความรู้นี้มีให้สำหรับคลาสย่อยที่เกี่ยวข้องเท่านั้น ดังนั้นความรับผิดชอบในการใช้วิธีโรงงานและสร้างออบเจกต์ที่เหมาะสมจึงเป็นเพียงความรับผิดชอบของคลาสย่อยเท่านั้น





การใช้ Factory Design Pattern ใน Java

บทความนี้ใช้แอปพลิเคชันการสร้างรายงานคำติชมตัวอย่าง แอปพลิเคชันนี้ใช้ความคิดเห็นประเภทต่างๆ ที่บริษัทได้รับ (สำหรับอาหารว่างใหม่) เพื่อสร้างรายงานเฉพาะ (โดยใช้วิธีการจากโรงงาน) ดังนั้น รูปแบบโรงงานจะสร้างคำติชมเฉพาะ (หรือรายงานคำติชม) โดยใช้ระดับผลิตภัณฑ์หลักต่อไปนี้เป็นฐาน:





 public abstract class Feedback { 
    
   private String reviewerName;
   private String reviewMessage;
   private int reviewRatings;
    
   public Feedback(String reviewerName, String reviewMessage, int reviewRatings) {
        this.reviewerName = reviewerName;
        this.reviewMessage = reviewMessage;
        this.reviewRatings = reviewRatings;
  }
    
  public String getReviewerName() {
      return reviewerName;
  }
  public void setReviewerName(String reviewerName) {
      this.reviewerName = reviewerName;
  }
  public String getReviewMessage() {
      return reviewMessage;
  }
  public void setReviewMessage(String reviewMessage) {
      this.reviewMessage = reviewMessage;
  }
  public int getReviewRatings() {
      return reviewRatings;
  }
  public void setReviewRatings(int reviewRatings) {
      this.reviewRatings = reviewRatings;
  }
}

ทุกคำติชมจะมีคุณสมบัติบังคับสามอย่าง ชื่อผู้วิจารณ์ ข้อความรีวิว และหมายเลขการให้คะแนน (ตั้งแต่หนึ่งถึงห้า) สำหรับอาหารว่างใหม่ ความคิดเห็นประเภทต่าง ๆ ที่บริษัทจะได้รับจะมาจากหนึ่งในสามช่องทาง:

อีเมลตอบกลับคลาส



 public class EmailFeedback extends Feedback { 
    
  private String reviewerEmail;

  public EmailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerEmail) {
     super(reviewerName, reviewMessage, reviewRatings);
     this.reviewerEmail = reviewerEmail;
  }
  public String getReviewerEmail() {
     return reviewerEmail;
  }
  public void setReviewerEmail(String reviewerEmail) {
     this.reviewerEmail = reviewerEmail;
  }
}

คลาสตอบกลับจดหมาย

 public class MailFeedback extends Feedback { 
    
   private String returnAddress;
    
   public MailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String returnAddress) {
        super(reviewerName, reviewMessage, reviewRatings);
        this.returnAddress = returnAddress;
     }

   public String getReturnAddress() {
       return returnAddress;
     }

   public void setReturnAddress(String returnAddress) {
       this.returnAddress = returnAddress;
     }
}

คลาสคำติชมโซเชียลมีเดีย





 public class SocialMediaFeedback extends Feedback { 

   private String reviewerHandle;

   public SocialMediaFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerHandle) {
        super(reviewerName, reviewMessage, reviewRatings);
        this.reviewerHandle = reviewerHandle;
     }
    
   public String getReviewerHandle() {
       return reviewerHandle;
     }

   public void setReviewerHandle(String reviewerHandle) {
       this.reviewerHandle = reviewerHandle;
     }
}

คุณจะสังเกตเห็นว่าแต่ละคลาสย่อยของคำติชมมีคุณสมบัติเฉพาะ ซึ่งหมายความว่าคุณจะต้องสร้างรายงานสำหรับความคิดเห็นแต่ละประเภทโดยใช้พร็อพเพอร์ตี้อย่างน้อยหนึ่งรายการที่ไม่ซ้ำกับประเภทนั้นๆ

โรงงานที่เรียบง่าย

โรงงานที่เรียบง่ายเป็นวิธีที่นิยมใช้รูปแบบการออกแบบโรงงาน วิธีการนี้นำมาซึ่งการจัดกลุ่มข้อเสนอแนะ (หรือผลิตภัณฑ์) ที่แตกต่างกันทั้งหมดในวิธีการ (โรงงานอย่างง่าย) และเลือกข้อเสนอแนะที่เหมาะสมตามพารามิเตอร์





 public class FeedbackReportFactory { 
    
    public Feedback makeFeedback(String feedbackType) {
         Feedback feedback = null;
          
         if(feedbackType.equals("email")) {
               feedback = new EmailFeedback();
         }else if (feedbackType.equals("mail")) {
               feedback = new MailFeedback();
         }else if (feedbackType.equals("social")) {
               feedback = new SocialMediaFeedback();
         }
     return feedback;
     }
}

อย่างไรก็ตาม วิธีการง่ายๆ ของโรงงานไม่ใช่รูปแบบการออกแบบของโรงงาน และไม่ใช่รูปแบบการออกแบบ มันเป็นเหมือนแนวคิดการออกแบบ

อุปกรณ์จ่ายไฟของคอมพิวเตอร์มีอายุการใช้งานนานเท่าใด

วิธีการของโรงงาน

วิธีการของโรงงานคือการแสดงรูปแบบการออกแบบที่แท้จริง ใช้วิธีการของโรงงานที่กลับเนื้อกลับตัว ข้อเสนอแนะรายงานโรงงาน คลาสจาวา ตอนนี้จะมีรหัสต่อไปนี้:

 public abstract class FeedbackReportFactory { 
    public abstract void makeFeedbackReport(Feedback feedback);
}

คุณสามารถกำหนดโครงสร้างของรูปแบบการออกแบบโรงงานด้วยแผนภาพคลาสต่อไปนี้:

  ไดอะแกรมคลาสวิธีการโรงงาน

จากแผนภาพด้านบน คุณจะเห็นว่าคลาสนามธรรม (หรืออินเทอร์เฟซ) จะมีเวอร์ชันนามธรรมของวิธีการจากโรงงาน ดังนั้น คลาสโรงงานคอนกรีตที่ขยายคลาสนามธรรมจะใช้เมธอดโรงงาน โดยใช้คุณสมบัติที่ไม่ซ้ำกับผลิตภัณฑ์ที่ต้องการสร้าง คุณควรทราบด้วยว่าคลาสโรงงานคอนกรีตใด ๆ ควรสร้างผลิตภัณฑ์อย่างน้อยหนึ่งรายการ

แอปพลิเคชันตัวอย่างมีสามผลิตภัณฑ์ที่เกี่ยวข้องแต่มีเอกลักษณ์เฉพาะตัว คำติชมแต่ละประเภทมีคุณสมบัติที่ไม่ซ้ำกันอย่างน้อยหนึ่งรายการ ดังนั้น แอปพลิเคชันจะต้องมีโรงงานคอนกรีตสามแห่งเพื่อสร้างผลิตภัณฑ์แต่ละชิ้น

โรงงานข้อเสนอแนะอีเมล

 public class EmailFeedbackReport extends FeedbackReportFactory{ 
    
    EmailFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
          
        this.feedback = (EmailFeedback) feedback;
          
        System.out.println("\nReport For Feedback Via Email" +
                  "\nReviewer Name: " +this.feedback.getReviewerName() +
                  "\nFeedback: " + this.feedback.getReviewMessage() +
                  "\nRatings: " + this.feedback.getReviewRatings() +
                  "\nEmal Address: " + this.feedback.getReviewerEmail());
     }
}

โรงงานตอบกลับจดหมาย

 public class MailFeedbackReport extends FeedbackReportFactory { 
    MailFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
         this.feedback = (MailFeedback) feedback;
          
         System.out.println("\nReport For Feedback Via Mail" +
                     "\nReviewer Name: " +this.feedback.getReviewerName() +
                     "\nFeedback: " + this.feedback.getReviewMessage() +
                     "\nRatings: " + this.feedback.getReviewRatings() +
                     "\nMailing Address: " + this.feedback.getReturnAddress());
     }
}

โรงงานตอบรับโซเชียลมีเดีย

 public class SocialMediaFeedbackReport extends FeedbackReportFactory { 
    SocialMediaFeedback feedback;

    @Override
    public void makeFeedbackReport(Feedback feedback) {
        this.feedback = (SocialMediaFeedback) feedback;
                
        System.out.println("\nReport For Feedback Via Social Media" +
                      "\nReviewer Name: " + this.feedback.getReviewerName() +
                      "\nFeedback: " + this.feedback.getReviewMessage() +
                      "\nRatings: " + this.feedback.getReviewRatings() +
                      "\nReviewer Social Media Handle: " + this.feedback.getReviewerHandle());
           }
}

การทดสอบแอปพลิเคชันตัวอย่าง

ตอนนี้คุณสามารถใช้วิธีการของโรงงานตามลำดับเพื่อสร้างรายงานขนาดย่อเกี่ยวกับคำติชมที่ได้รับจากช่องทางต่างๆ คุณสามารถ ทดสอบแอปพลิเคชันโดยใช้ JUnit หรือคุณสามารถสร้างคลาสไดรเวอร์:

วิธีแก้ไข ghost touch บน iphone x
 public class Main { 

   public static void main(String[] args) {
       Feedback feedback = new EmailFeedback("Nick", "Great product!", 5, "nick@email.com");
       Feedback feedback2 = new MailFeedback("john", "The product is good but not something I would buy regularly", 4, "first Street");
       Feedback feedback3 = new SocialMediaFeedback("Jane", "It's not for me", 2, "@janey");
          
       FeedbackReportFactory factory = new EmailFeedbackReport();
       FeedbackReportFactory factory2 = new MailFeedbackReport();
       FeedbackReportFactory factory3 = new SocialMediaFeedbackReport();
          
       factory.makeFeedbackReport(feedback);
       factory2.makeFeedbackReport(feedback2);
       factory3.makeFeedbackReport(feedback3);
   }

คลาสหลักด้านบนใช้โรงงานที่เกี่ยวข้องเพื่อสร้างรายงานสามฉบับ สร้างเอาต์พุตต่อไปนี้ในคอนโซล:

  เอาต์พุตคอนโซลเมธอดจากโรงงาน

ข้อดีของการใช้รูปแบบการออกแบบโรงงาน

รูปแบบการออกแบบโรงงานส่งเสริมความยืดหยุ่นในการออกแบบ โดยที่คุณใช้อินเทอร์เฟซ (หรือคลาสนามธรรม) เพื่อสร้างคลาสที่เป็นรูปธรรม นอกจากนี้ยังส่งเสริมความสามารถในการปรับขนาดผ่านความหลากหลายโดยอนุญาตให้คลาสใหม่ใช้อินเทอร์เฟซที่มีอยู่เมื่อแอปพลิเคชันขยาย

เมื่อคุณใช้รูปแบบการออกแบบโรงงาน คุณกำลังใช้หลักการออกแบบที่สำคัญสองประการ: เปิด-ปิด และผกผันของการควบคุม (IoC)