בנאי Factory
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 14 מתוך 110.
בנאי factory הוא בנאי מיוחד שלא תמיד יוצר מופע חדש. בניגוד לבנאים רגילים, בנאי factory יכול להחזיר מופע קיים, תת־סוג או אפילו null (אם הוא nullable). מצהירים עליו באמצעות מילת המפתח factory.
class Logger {
static final Logger _instance = Logger._internal();
// בנאי בעל שם פרטי
Logger._internal();
// בנאי מפעל
factory Logger() {
return _instance;
}
}
Logger log1 = Logger();
Logger log2 = Logger();
print(identical(log1, log2)); // trueבדוגמה הזאת, בנאי המפעל תמיד מחזיר את אותו מופע. לא משנה כמה פעמים תקרא ל-Logger(), תקבל את אותו אובייקט. דפוס זה משמש בדרך כלל למימוש סינגלטונים.
בנאים מסוג Factory שונים מבנאים רגילים בהיבט מרכזי: אין להם גישה ל־this, מכיוון שייתכן שהם כלל לא יוצרים מופע חדש. במקום זאת, עליהם להחזיר אובייקט במפורש:
class Shape {
factory Shape(String type) {
if (type == 'circle') return Circle();
if (type == 'square') return Square();
return Rectangle();
}
}
class Circle extends Shape { Circle() : super._(); }
class Square extends Shape { Square() : super._(); }
class Rectangle extends Shape { Rectangle() : super._(); }בנאים של מפעל שימושיים כשאתם צריכים לשלוט ביצירת מופעים, למשל כדי להחזיר אובייקטים שמורים במטמון, לממש מאגרי אובייקטים או להחליט איזה תת־סוג ליצור על סמך פרמטרי קלט.
אתגר
קלבואו נבנה מערכת התראות שמשתמשת בבנאי factory כדי ליצור סוגים שונים של התראות על סמך קלט פשוט מסוג מחרוזת.
תיצרו שני קבצים כדי לארגן את הקוד:
notification.dart: הגדירו מחלקה בשםNotificationשתשמש כמחלקת הבסיס לכל סוגי ההתראות. המחלקה צריכה לכלול:- שדה
String message - בנאי פרטי בעל שם
Notification._internalשמאתחל את ההודעה - בנאי factory בשם
Notification(String type, String message)שמחזיר תתי־סוגים שונים של התראות על סמך הפרמטרtype:- אם type הוא
'email', החזירוEmailNotification - אם type הוא
'sms', החזירוSMSNotification - אחרת, החזירו
PushNotification
- אם type הוא
- מתודה
send()שמדפיסהSending: [message]
- שדה
באותו קובץ, צרו שלוש מחלקות משנה שיורשות מ־Notification:
EmailNotification: דרסו אתsend()כדי להדפיסEmail: [message]SMSNotification: דרסו אתsend()כדי להדפיסSMS: [message]PushNotification: דרסו אתsend()כדי להדפיסPush: [message]
כל מחלקת משנה צריכה לכלול בנאי שמקבל message ומעביר אותו למחלקת האב באמצעות super._internal(message).
main.dart: ייבאו את מחלקת ההתראות וצרו שלוש התראות באמצעות הבנאי מסוג factory:- התראת דוא״ל עם ההודעה
'Welcome!' - התראת SMS עם ההודעה
'Your code is 1234' - התראת Push עם ההודעה
'New update available'
send()עבור כל התראה, לפי הסדר שמופיע למעלה.- התראת דוא״ל עם ההודעה
הפלט הצפוי:
Email: Welcome!
SMS: Your code is 1234
Push: New update availableנסו בעצמכם
import 'notification.dart';
void main() {
// TODO: צרו התראה בדוא״ל עם ההודעה 'Welcome!'
// TODO: צרו התראת SMS עם ההודעה 'Your code is 1234'
// TODO: צרו התראת push עם ההודעה 'New update available'
// TODO: קראו ל־send() עבור כל התראה לפי הסדר
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםספריות וייבואמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותמשתני מופעיסודות הבנאיחזרה: מחשבון פשוט4בטיחות מפני ערכי null
מבוא לבטיחות מפני ערכי nullניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-nullהאופרטורים ? ו-!מילת המפתח Late ובטיחות מפני ערכי nullאופרטורים מודעי nullבטיחות מפני ערכי null במחלקותסיכום – מערכת פרופילי משתמשים7מחלקות מופשטות וממשקים
מחלקות מופשטותמתודות מופשטותממשקים ב-Dartממשקים משתמעיםמימוש לעומת הורשהממשקים מרוביםחזרה – מחשבון צורות10אוספים וגנריות
סקירה כללית של List, Set ו-Mapאוספים בטוחים מבחינת טיפוסיםמחלקות גנריותמתודות גנריותאילוצים גנרייםIterable ו-Iteratorסיכום – אחסון גנרי13מושגי OOP מתקדמים
הרכבה לעומת הורשהמתודות הרחבהמחלקות קריאותמחלקות אטומות (Dart 3)רשומות (Dart 3)תבניות והתאמה (3.0)טיפוסים מונים עם מתודות16פרויקט: ניהול ספרייה
סקירת הפרויקטמחלקות ספר ומשתמש2בנאים ב-Dart
בנאי ברירת מחדלבנאים בעלי שםרשימות אתחולבנאים קבועיםבנאי Factoryבנאים מפניםסיכום - בונה צורות5כימוס
חברים ציבוריים לעומת פרטייםמוסכמת הקידומת _פרטיות ברמת הספרייההעמקה ב-getters וב-settersהסתרת מידעסיכום – רשומות תלמידים8מיקסינים
מבוא למיקסיניםיצירת מיקסיניםשימוש במספר מיקסיניםמילת המפתח on במיקסיניםמיקסינים לעומת ירושהמיקסינים לעומת ממשקסיכום – מערכת בעלי החיים3מאפייני מחלקה
איברי מופע לעומת איברים סטטייםשדות final ו-constמשתני lateמתודות ושדות סטטייםGetters ו-Settersסיכום – מנהל חשבונות בנק6ירושה
ירושה בסיסיתמילת המפתח superדריסת מתודותהאנוטציה @overrideמילת המפתח final למחלקהבנאים וירושהסיכום – היררכיית עובדים9פולימורפיזם
יסודות הפולימורפיזםפולימורפיזם באמצעות ממשקיםבדיקת טיפוסים בזמן ריצההאופרטורים is ו-asמילת המפתח קווריאנטיסיכום — מעבד תשלומים12תכנות מונחה עצמים אסינכרוני
Future-ים ו-async/awaitיסודות ה-Streamsבקרי Streamsבנאים אסינכרונייםאסינכרוניות במתודות של מחלקהסיכום - אחזור נתוניםתרגלו בעצמכם: קומפיילר Dart אונליין