Menu
Coddy logo textTech

תבנית Factory

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 66 מתוך 87.

תבנית המפעל היא תבנית עיצוב ליצירה, שמעבירה את יצירת האובייקטים לשיטה או למחלקה נפרדת. במקום להשתמש ב־new ישירות בקוד שלך, מבקשים ממפעל ליצור עבורך אובייקטים. הדבר שימושי במיוחד כשיש לך כמה מחלקות קשורות שחולקות ממשק או מחלקת אב משותפים.

נבחן מערכת התראות שיכולה לשלוח הודעות דוא״ל, הודעות SMS או התראות בדחיפה. ללא מפעל, הקוד שלך יצטרך להכיר כל מחלקה קונקרטית:

// ללא Factory - הלקוח חייב להכיר את כל המחלקות הקונקרטיות
Notification notification;
if (type.equals("email")) {
    notification = new EmailNotification();
} else if (type.equals("sms")) {
    notification = new SMSNotification();
}

באמצעות תבנית המפעל, מרכזים את לוגיקת היצירה הזו:

public interface Notification {
    void send(String message);
}

public class EmailNotification implements Notification {
    public void send(String message) {
        System.out.println("Email: " + message);
    }
}

public class SMSNotification implements Notification {
    public void send(String message) {
        System.out.println("SMS: " + message);
    }
}

public class NotificationFactory {
    public static Notification create(String type) {
        if (type.equals("email")) {
            return new EmailNotification();
        } else if (type.equals("sms")) {
            return new SMSNotification();
        }
        return null;
    }
}

כעת קוד הלקוח נקי יותר ואינו תלוי במחלקות קונקרטיות:

Notification notification = NotificationFactory.create("email");
notification.send("Hello!");  // פלט: Email: Hello!

היתרון המרכזי הוא שהוספת סוגי התראות חדשים דורשת עדכון של המפעל בלבד: קוד הלקוח נשאר ללא שינוי. כך פועלים לפי העיקרון של תכנות מול ממשק, שהופך את המערכת שלך לגמישה יותר וקלה יותר להרחבה.

challenge icon

אתגר

קל

בואו נבנה מערכת לציור צורות באמצעות תבנית המפעל! במקום ליצור אובייקטים של צורות ישירות ברחבי הקוד, תרכזו את לוגיקת היצירה במפעל שמפיק סוגים שונים של צורות על סמך מזהה מחרוזת פשוט.

תארגנו את הקוד בארבעה קבצים:

  • Shape.java: הגדירו ממשק בשם Shape שישמש כחוזה המשותף לכל הצורות. הממשק שלכם צריך להצהיר על מתודה יחידה draw(), שלא מחזירה דבר אלא מדפיסה מידע על הצורה שמצוירת.
  • Shapes.java: צרו שלוש מחלקות שמממשות את הממשק Shape:

    Circle - המתודה draw() שלה צריכה להדפיס Drawing a Circle

    Rectangle - המתודה draw() שלה צריכה להדפיס Drawing a Rectangle

    Triangle - המתודה draw() שלה צריכה להדפיס Drawing a Triangle

  • ShapeFactory.java: צרו את מחלקת המפעל שאחראית ליצירת צורות. למחלקה ShapeFactory צריכה להיות מתודה סטטית createShape(String type) שמחזירה Shape. בהתאם לפרמטר type:
    • אם type שווה ל-"circle", החזירו Circle חדש
    • אם type שווה ל-"rectangle", החזירו Rectangle חדש
    • אם type שווה ל-"triangle", החזירו Triangle חדש
    • עבור כל ערך אחר, החזירו null
  • Main.java: חברו את מערכת המפעל שלכם! תקבלו שתי קלטים: שני סוגי צורות (שניהם מסוג String).

    עבור כל קלט, השתמשו ב-ShapeFactory כדי ליצור את הצורה ולאחסן אותה במשתנה מסוג Shape. אם המפעל מחזיר צורה תקינה (לא null), קראו למתודה draw() שלה. אם הוא מחזיר null, הדפיסו Unknown shape: [type], כאשר [type] הוא הקלט שסופק.

    עבדו על שני הקלטים לפי הסדר, וכל אחד מהם בשורה נפרדת בפלט.

תקבלו שני קלטים לפי הסדר: סוג הצורה הראשון (String) וסוג הצורה השני (String).

שימו לב שמחלקת Main שלכם לעולם אינה משתמשת ישירות ב-new Circle() או ב-new Rectangle(). היא מכירה רק את הממשק Shape ומבקשת מהמפעל ליצור אובייקטים. זהו כוחה של תבנית המפעל: קוד הלקוח אינו תלוי במחלקות הקונקרטיות!

נסו בעצמכם

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קראו שני סוגי צורות
        String type1 = scanner.nextLine();
        String type2 = scanner.nextLine();
        
        // TODO: השתמשו ב-ShapeFactory כדי ליצור את הצורה הראשונה
        // אם הצורה אינה null, קראו ל-draw()
        // אם הצורה היא null, הדפיסו "Unknown shape: [type]"
        
        // TODO: עשו את אותו הדבר עבור הצורה השנייה
        
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין