תבנית המפעל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 דורשת שינויים רק במפעל, ולא בכל מקום שבו יוצרים מסמכים. ההפרדה הזאת מקלה על תחזוקת בסיס הקוד ועל בדיקתו.
אתגר
קלבוא נבנה מערכת התראות באמצעות תבנית המפעל (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 והדפס את התוצאה
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית10תבניות עיצוב חלק 1
מבוא לתבניות עיצובSingleton בטוח לריבוי תהליכוניםתבנית המפעלתבנית הצופה (אירועים)תבנית האסטרטגיה2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין