Menu
Coddy logo textTech

תבנית המפעל

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 53 מתוך 70.

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

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

// ללא Factory - לוגיקת יצירה מפוזרת
IDocument doc;
if (type == "pdf")
    doc = new PdfDocument();
else if (type == "word")
    doc = new WordDocument();

מפעל מרכז את קבלת ההחלטות הזו במקום אחד:

public interface IDocument
{
    void Open();
}
public class PdfDocument : IDocument
{
    public void Open() => Console.WriteLine("Opening PDF");
}
public class WordDocument : IDocument
{
    public void Open() => Console.WriteLine("Opening Word");
}
public class DocumentFactory
{
    public IDocument Create(string type)
    {
        switch (type)
        {
            case "pdf":
                return new PdfDocument();
            case "word":
                return new WordDocument();
            default:
                throw new ArgumentException("Unknown type");
        }
    }
}

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

var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open();  // פתיחת PDF

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

challenge icon

אתגר

קל

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

תארגן את הקוד שלך בשלושה קבצים:

  • Notification.cs: הגדר ממשק INotification במרחב השמות Notifications עם מתודה יחידה Send(string message) שמחזירה מחרוזת. לאחר מכן צור שלוש מחלקות שמממשות את הממשק:
    • EmailNotification - מחזירה "Email: {message}"
    • SmsNotification - מחזירה "SMS: {message}"
    • PushNotification - מחזירה "Push: {message}"
  • NotificationFactory.cs: צור מחלקת NotificationFactory באותו מרחב שמות, עם מתודת Create(string type) שמחזירה את INotification המתאים על סמך מחרוזת הסוג:
    • "email" מחזיר מופע של EmailNotification
    • "sms" מחזיר מופע של SmsNotification
    • "push" מחזיר מופע של PushNotification
    עבור כל סוג שאינו מזוהה, החזר EmailNotification כברירת מחדל.
  • Program.cs: חבר הכול יחד על ידי יצירת מופע של המפעל ושימוש בו ליצירת התראות על סמך הקלט. המפעל מטפל בכל ההחלטות לגבי המחלקה הקונקרטית שיש ליצור לה מופע.

תקבל שני קלטים:

  • סוג ההתראה (למשל, sms)
  • ההודעה לשליחה (למשל, Your order has shipped)

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

לדוגמה, אם הקלטים הם push ו-Meeting in 5 minutes, הפלט צריך להיות:

Push: Meeting in 5 minutes

שים לב שהקוד הראשי שלך לעולם לא משתמש ב-new EmailNotification() או במשהו דומה — הוא פשוט מבקש מהמפעל את מה שהוא צריך. אם בהמשך תוסיף SlackNotification, תצטרך לעדכן רק את המפעל, ולא כל מקום שיוצר התראות!

נסו בעצמכם

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // קרא את הקלט
        string type = Console.ReadLine();
        string message = Console.ReadLine();

        // TODO: צור מופע של NotificationFactory

        // TODO: השתמש במפעל כדי ליצור את ההתראה המתאימה

        // TODO: קרא למתודה Send והדפס את התוצאה
    }
}
quiz iconבחנו את עצמכם

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

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

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