Menu
Coddy logo textTech

בנאי 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._(); }

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

challenge icon

אתגר

קל

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

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

  • notification.dart: הגדירו מחלקה בשם Notification שתשמש כמחלקת הבסיס לכל סוגי ההתראות. המחלקה צריכה לכלול:
    • שדה String message
    • בנאי פרטי בעל שם Notification._internal שמאתחל את ההודעה
    • בנאי factory בשם Notification(String type, String message) שמחזיר תתי־סוגים שונים של התראות על סמך הפרמטר type:
      • אם type הוא 'email', החזירו EmailNotification
      • אם type הוא 'sms', החזירו SMSNotification
      • אחרת, החזירו PushNotification
    • מתודה 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() עבור כל התראה לפי הסדר
}
quiz iconבחנו את עצמכם

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

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

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