/ / Mẫu thiết kế nhà máy là gì?

Mẫu thiết kế nhà máy là gì?

Mẫu thiết kế nhà máy (hoặc phương pháp nhà máy) chuyên về ủy quyền và đóng gói. Mẫu này cho phép một siêu lớp trì hoãn việc khởi tạo các lớp con. Điều này là do lớp chứa mẫu phương thức xuất xưởng chính là lớp trừu tượng.


Phiên bản gốc của phương thức xuất xưởng giả định dạng của một phương thức chưa được thực hiện vì nó không biết sản phẩm mà nó sẽ tạo ra. Phương pháp xuất xưởng có thể biết rằng nó đang tạo ra một số sản phẩm, nhưng nó không biết các đặc điểm cụ thể của sản phẩm mà nó sẽ tạo ra. Kiến thức này chỉ có sẵn cho các lớp con tương ứng. Do đó, trách nhiệm triển khai phương thức xuất xưởng và tạo các đối tượng thích hợp chỉ thuộc về lớp con.


Triển khai Mẫu thiết kế nhà máy trong Java

Bài viết này sử dụng một ứng dụng tạo báo cáo phản hồi mẫu. Ứng dụng này sử dụng các loại phản hồi khác nhau mà một công ty nhận được (đối với một món ăn nhẹ mới) để tạo các báo cáo cụ thể (sử dụng phương pháp xuất xưởng). Do đó, mẫu xuất xưởng sẽ tạo phản hồi cụ thể (hoặc báo cáo phản hồi), sử dụng loại sản phẩm chính sau đây làm cơ sở:

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

Mỗi phản hồi sẽ có ba thuộc tính bắt buộc, tên người đánh giá, thông báo đánh giá và xếp hạng số (từ một đến năm) cho món ăn nhẹ mới. Các loại phản hồi khác nhau mà công ty sẽ nhận được sẽ đến từ một trong ba kênh sau:

Lớp phản hồi email

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

Lớp phản hồi qua thư

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

Lớp phản hồi trên mạng xã hội

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

Bạn sẽ nhận thấy rằng mỗi lớp con phản hồi có một thuộc tính duy nhất. Điều này có nghĩa là bạn sẽ cần tạo báo cáo cho từng loại phản hồi bằng cách sử dụng ít nhất một thuộc tính duy nhất cho loại đó.

Nhà máy đơn giản

Một nhà máy đơn giản là một cách tiếp cận phổ biến để sử dụng mẫu thiết kế nhà máy. Cách tiếp cận này đòi hỏi phải nhóm tất cả các phản hồi (hoặc sản phẩm) khác nhau trong một phương pháp (nhà máy đơn giản) và chọn phản hồi thích hợp dựa trên một tham số.

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

Tuy nhiên, cách tiếp cận nhà máy đơn giản không phải là mẫu thiết kế nhà máy, cũng không phải là mẫu thiết kế. Nó giống như một khái niệm thiết kế hơn.

Phương pháp nhà máy

Phương thức nhà máy là đại diện thực sự của mẫu thiết kế. Sử dụng phương pháp nhà máy, cải cách Phản hồiBáo cáoNhà máy Bây giờ lớp Java sẽ chứa đoạn mã sau:

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

Bạn có thể xác định cấu trúc của mẫu thiết kế nhà máy bằng sơ đồ lớp sau:

Sơ đồ lớp phương thức nhà máy

Từ sơ đồ trên, bạn sẽ thấy rằng một lớp trừu tượng (hoặc giao diện) sẽ chứa một phiên bản trừu tượng của phương thức xuất xưởng. Vì vậy, các lớp nhà máy cụ thể mở rộng lớp trừu tượng sẽ triển khai phương thức nhà máy, sử dụng các thuộc tính duy nhất cho sản phẩm mà nó muốn tạo. Bạn cũng nên lưu ý rằng bất kỳ lớp nhà máy bê tông nào cũng nên tạo ra một hoặc nhiều sản phẩm.

Ứng dụng mẫu có ba sản phẩm liên quan nhưng độc đáo. Mỗi loại phản hồi có ít nhất một thuộc tính duy nhất. Vì vậy, ứng dụng sẽ cần có ba nhà máy bê tông để xây dựng từng sản phẩm.

Nhà máy phản hồi email

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

Nhà máy phản hồi qua thư

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

Nhà máy phản hồi truyền thông xã hội

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

Kiểm tra ứng dụng mẫu

Giờ đây, bạn có thể sử dụng các phương pháp xuất xưởng tương ứng để tạo báo cáo thu nhỏ về phản hồi nhận được từ các kênh khác nhau. Bạn có thể kiểm tra ứng dụng bằng JUnit hoặc bạn có thể tạo một lớp trình điều khiển:

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

Lớp Chính ở trên sử dụng các nhà máy tương ứng để tạo ba báo cáo, tạo ra đầu ra sau trong bảng điều khiển:

Đầu ra bảng điều khiển phương thức xuất xưởng

Ưu điểm của việc sử dụng Factory Design Pattern

Mẫu thiết kế nhà máy thúc đẩy tính linh hoạt trong thiết kế, nơi bạn sử dụng các giao diện (hoặc các lớp trừu tượng) để tạo các lớp cụ thể. Nó cũng thúc đẩy khả năng mở rộng thông qua tính đa hình, bằng cách cho phép các lớp mới triển khai giao diện hiện có khi ứng dụng mở rộng.

Khi bạn sử dụng mẫu thiết kế nhà máy, bạn đang sử dụng hai nguyên tắc thiết kế quan trọng: Đóng mở và Đảo ngược điều khiển (IoC).

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *