รูปแบบการออกแบบโรงงาน (หรือวิธีการโรงงาน) เชี่ยวชาญในการมอบหมายและการห่อหุ้ม รูปแบบนี้อนุญาตให้ซูเปอร์คลาสเลื่อนการสร้างอินสแตนซ์ไปยังคลาสย่อย นี่เป็นเพราะคลาสที่มีรูปแบบเมธอดโรงงานหลักนั้นเป็นนามธรรม
เวอร์ชันดั้งเดิมของเมธอดโรงงานถือว่าอยู่ในรูปของเมธอดที่ไม่ได้ใช้งาน เนื่องจากไม่รู้จักผลิตภัณฑ์ที่จะสร้างขึ้น วิธีการของโรงงานอาจรู้ว่ากำลังสร้างผลิตภัณฑ์บางอย่าง แต่ไม่ทราบลักษณะเฉพาะของผลิตภัณฑ์ที่จะสร้างขึ้น ความรู้นี้มีให้สำหรับคลาสย่อยที่เกี่ยวข้องเท่านั้น ดังนั้นความรับผิดชอบในการใช้วิธีโรงงานและสร้างออบเจกต์ที่เหมาะสมจึงเป็นเพียงความรับผิดชอบของคลาสย่อยเท่านั้น
การใช้ 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)