תבנית העיצוב של המפעל (או שיטת המפעל) מתמחה בהאצלה ואנקפסולציה. דפוס זה מאפשר למחלקת-על לדחות מופע לתת-מחלקות. הסיבה לכך היא שהמחלקה המכילה את תבנית שיטת המפעל העיקרית היא מופשטת.
הגרסה המקורית של שיטת המפעל לובשת צורה של שיטה לא מיושמת מכיוון שהיא לא מכירה את המוצר שהיא תיצור. שיטת המפעל אולי יודעת שהיא יוצרת מוצר כלשהו, אבל היא לא יודעת את המאפיינים הספציפיים של המוצר שהיא תיצור. ידע זה זמין רק לתתי המחלקות המתאימות. לכן, האחריות ליישם את שיטת המפעל וליצור אובייקטים מתאימים היא אך ורק של תת מחלקה.
הטמעת דפוס עיצוב המפעל בג'אווה
מאמר זה משתמש ביישום ליצירת דוחות משוב לדוגמה. אפליקציה זו משתמשת בסוגי המשוב השונים שחברה מקבלת (עבור חטיף חדש) כדי ליצור דוחות ספציפיים (בשיטת המפעל). לכן, דפוס המפעל יצור משוב ספציפי (או דוח משוב), תוך שימוש במחלקת המוצר הראשית הבאה כבסיס:
פּוּמְבֵּיתַקצִירמעמדמָשׁוֹב{
פְּרָטִי חוּט reviewerName;
פְּרָטִי חוּט reviewMessage;
פְּרָטִיint דירוגי ביקורת;
פּוּמְבֵּימָשׁוֹב(String reviewerName, String reviewMessage, int דירוגי ביקורת){
זֶה.reviewerName = reviewerName;
זֶה.reviewMessage = reviewMessage;
זֶה.reviewRatings = reviewRatings;
}
פּוּמְבֵּי חוּט getReviewerName(){
לַחֲזוֹר reviewerName;
}
פּוּמְבֵּיבָּטֵלsetReviewerName(שם סוקר מחרוזת){
זֶה.reviewerName = reviewerName;
}
פּוּמְבֵּי חוּט getReviewMessage(){
לַחֲזוֹר reviewMessage;
}
פּוּמְבֵּיבָּטֵלsetReviewMessage(הודעה סקירת מחרוזת){
זֶה.reviewMessage = reviewMessage;
}
פּוּמְבֵּיintgetReviewRatings(){
לַחֲזוֹר דירוגי ביקורת;
}
פּוּמְבֵּיבָּטֵלsetReviewRatings(int דירוגי ביקורת){
זֶה.reviewRatings = reviewRatings;
}
}
לכל משוב יהיו שלושה מאפיינים חובה, שם מבקר, הודעת ביקורת ודירוג מספר (מאחד עד חמש) לחטיף החדש. סוגי המשוב השונים שהחברה תקבל יגיעו מאחד משלושה ערוצים:
שיעור משוב באימייל
פּוּמְבֵּימעמדמשוב באימיילמשתרעמָשׁוֹב{
פְּרָטִי חוּט מבקר דוא"ל;
משוב דוא"ל ציבורי(חוּט שם המבקר, חוּט reviewMessage, int reviewRatings, חוּט דוא"ל מבקר) {
סוּפֶּר(ReviewerName, reviewMessage, reviewRatings);
זֶה.reviewerEmail = reviewerEmail;
}
פּוּמְבֵּי חוּט getReviewerEmail(){
לַחֲזוֹר מבקר דוא"ל;
}
פּוּמְבֵּיבָּטֵלsetReviewerEmail(דוא"ל סוקר מחרוזות){
זֶה.reviewerEmail = reviewerEmail;
}
}
שיעור משוב בדואר
פּוּמְבֵּימעמדמשוב בדוארמשתרעמָשׁוֹב{
פְּרָטִי חוּט returnAddress;
משוב דואר ציבורי (חוּט שם המבקר, חוּט reviewMessage, int reviewRatings, חוּט returnAddress) {
סוּפֶּר(ReviewerName, reviewMessage, reviewRatings);
זֶה.returnAddress = returnAddress;
}פּוּמְבֵּי חוּט getReturnAddress(){
לַחֲזוֹר returnAddress;
}
פּוּמְבֵּיבָּטֵלsetReturnAddress(מחרוזת returnAddress){
זֶה.returnAddress = returnAddress;
}
}
שיעור משוב במדיה חברתית
פּוּמְבֵּימעמדמשוב SocialMediaמשתרעמָשׁוֹב{
פְּרָטִי חוּט מבקר ידית;
משוב SocialMedia ציבורי(חוּט שם המבקר, חוּט reviewMessage, int reviewRatings, חוּט reviewerHandle) {
סוּפֶּר(ReviewerName, reviewMessage, reviewRatings);
זֶה.reviewerHandle = reviewerHandle;
}
פּוּמְבֵּי חוּט getReviewerHandle(){
לַחֲזוֹר מבקר ידית;
}
פּוּמְבֵּיבָּטֵלsetReviewerHandle(ידית סוקר מחרוזות){
זֶה.reviewerHandle = reviewerHandle;
}
}
תבחין שלכל תת-מחלקת משוב יש מאפיין ייחודי. משמעות הדבר היא שתצטרך ליצור את הדוח עבור כל סוג משוב באמצעות לפחות מאפיין אחד שייחודי לאותו סוג.
המפעל הפשוט
מפעל פשוט הוא גישה פופולרית לשימוש בדפוס עיצוב המפעל. גישה זו כוללת קיבוץ של כל המשובים (או המוצרים) השונים בשיטה (המפעל הפשוט) ובחירת המשוב המתאים על סמך פרמטר.
פּוּמְבֵּימעמדFeedbackReportFactory{
פּוּמְבֵּי מָשׁוֹב לעשות משוב(Type feedback של מחרוזת){
משוב משוב = ריק;
אם(feedbackType.equals("אימייל")) {
משוב = חָדָשׁ Email משוב();
}אַחֵראם (feedbackType.equals("דוֹאַר")) {
משוב = חָדָשׁ MailFeedback();
}אַחֵראם (feedbackType.equals("חֶברָתִי")) {
משוב = חָדָשׁ SocialMedia Feedback();
}
לַחֲזוֹר מָשׁוֹב;
}
}
עם זאת, גישת המפעל הפשוטה אינה תבנית עיצוב המפעל, והיא גם לא תבנית עיצובית. זה יותר כמו קונספט עיצובי.
שיטת המפעל
שיטת המפעל היא הייצוג האמיתי של תבנית העיצוב. בשיטת המפעל, הרפורמים FeedbackReportFactoryשיעור Java יכיל כעת את הקוד הבא:
פּוּמְבֵּיתַקצִירמעמדFeedbackReportFactory{
פּוּמְבֵּיתַקצִירבָּטֵללעשות משוב לדווח(משוב משוב);
}
אתה יכול להגדיר את המבנה של תבנית עיצוב המפעל באמצעות דיאגרמת המחלקה הבאה:
מהתרשים שלמעלה תראה שמחלקה מופשטת (או ממשק) תכיל גרסה מופשטת של שיטת המפעל. אז, מחלקות המפעל הבטון שמרחיבות את המחלקה המופשטת יישמו את שיטת המפעל, תוך שימוש במאפיינים הייחודיים למוצר שהוא רוצה ליצור. כמו כן, כדאי לשים לב שכל כיתת מפעל בטון צריכה ליצור מוצר אחד או יותר.
ליישום לדוגמה יש שלושה מוצרים קשורים אך ייחודיים. לכל סוג משוב יש לפחות מאפיין ייחודי אחד. לכן, לאפליקציה יהיו שלושה מפעלי בטון כדי לבנות כל מוצר.
מפעל משוב באימייל
פּוּמְבֵּימעמדדוח משוב בדוא"למשתרעFeedbackReportFactory{
משוב באימייל;
@עקוף
פּוּמְבֵּיבָּטֵללעשות משוב לדווח(משוב משוב){
זֶה.feedback = (EmailFeedback) משוב;
מערכת.הַחוּצָה.println("\nדווחלמָשׁוֹבבאמצעותאימייל" +
"\nשם המבקר: " +זֶה.feedback.getReviewerName() +
"\nמשוב: " + זֶה.feedback.getReviewMessage() +
"\nדירוגים: " + זֶה.feedback.getReviewRatings() +
"\nכתובת אמל: " + זֶה.feedback.getReviewerEmail());
}
}
מפעל משוב דואר
פּוּמְבֵּימעמדדואר משוב דוארמשתרעFeedbackReportFactory{
משוב דואר משוב;
@עקוף
פּוּמְבֵּיבָּטֵללעשות משוב לדווח(משוב משוב){
זֶה.feedback = (MailFeedback) משוב;
מערכת.הַחוּצָה.println("\nדווחלמָשׁוֹבבאמצעותדוֹאַר" +
"\nשם המבקר: " +זֶה.feedback.getReviewerName() +
"\nמשוב: " + זֶה.feedback.getReviewMessage() +
"\nדירוגים: " + זֶה.feedback.getReviewRatings() +
"\nכתובת דואר: " + זֶה.feedback.getReturnAddress());
}
}
מפעל משוב מדיה חברתית
פּוּמְבֵּימעמדדוח משוב SocialMediaמשתרעFeedbackReportFactory{
משוב SocialMedia משוב;
@עקוף
פּוּמְבֵּיבָּטֵללעשות משוב לדווח(משוב משוב){
זֶה.feedback = (SocialMediaFeedback) משוב;
מערכת.הַחוּצָה.println("\nדווחלמָשׁוֹבבאמצעותחֶברָתִיכְּלֵי תִקְשׁוֹרֶת" +
"\nשם המבקר: " + זֶה.feedback.getReviewerName() +
"\nמשוב: " + זֶה.feedback.getReviewMessage() +
"\nדירוגים: " + זֶה.feedback.getReviewRatings() +
"\nידית סוקר מדיה חברתית: " + זֶה.feedback.getReviewerHandle());
}
}
בדיקת היישום לדוגמה
כעת אתה יכול להשתמש בשיטות המפעל המתאימות כדי ליצור דוחות מיניאטוריים על המשוב שהתקבל מהערוצים השונים. אתה יכול בדוק את האפליקציה באמצעות JUnit, או שאתה יכול ליצור כיתת נהגים:
פּוּמְבֵּימעמדרָאשִׁי{
פּוּמְבֵּיסטָטִיבָּטֵלרָאשִׁי(מחרוזת[] args){
משוב משוב = חָדָשׁ אימייל משוב("ניק", "מוצר נהדר!", 5, "[email protected]");
משוב משוב2 = חָדָשׁ משוב דואר("ג'ון", "המוצר טוב אבל לא משהו שהייתי קונה באופן קבוע", 4, "רחוב ראשון");
משוב משוב3 = חָדָשׁ משוב SocialMedia("ג'יין", "זה לא בשבילי", 2, "@ג'ייני");
FeedbackReportFactory factory = חָדָשׁ EmailFeedbackReport();
FeedbackReportFactory factory2 = חָדָשׁ MailFeedbackReport();
FeedbackReportFactory Factory3 = חָדָשׁ SocialMedia FeedbackReport();
בית חרושת.makeFeedbackReport(מָשׁוֹב);
מפעל 2.makeFeedbackReport(משוב2);
מפעל 3.makeFeedbackReport(משוב3);
}
המחלקה הראשית שלמעלה משתמשת במפעלים המתאימים ליצירת שלושה דוחות, ומפיקה את הפלט הבא במסוף:
יתרונות השימוש בתבנית עיצוב המפעל
דפוס עיצוב המפעל מקדם גמישות עיצובית, שבה אתה משתמש בממשקים (או מחלקות מופשטות) כדי ליצור שיעורים קונקרטיים. זה גם מקדם מדרגיות באמצעות פולימורפיזם, על ידי מתן אפשרות למחלקות חדשות ליישם את הממשק הקיים ככל שהאפליקציה מתרחבת.
כשאתה משתמש בדפוס עיצוב המפעל, אתה משתמש בשני עקרונות עיצוב חשובים: פתוח-סגור והיפוך שליטה (IoC).