Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المنشئات المصنعية

جزء من قسم البرمجة كائنية التوجه في رحلة Dart على Coddy. الدرس 14 من 110.

إن factory constructor هو constructor خاص لا ينشئ دائمًا instance جديدة. وعلى خلاف constructors العادية، يمكن لـ factory constructor أن يعيد instance موجودة، أو subtype، أو حتى null (إذا كانت قابلة لأن تكون null). وتعلنه باستخدام الكلمة المفتاحية 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

في هذا المثال، يعيد مُنشئ factory دائمًا نفس الـ instance. وبغضّ النظر عن عدد مرات إجراء Logger()، ستحصل على الكائن identical. يُستخدم هذا النمط عادةً لتنفيذ النماذج الفردية.

تختلف Factory constructors عن المُنشئات العادية بطريقة أساسية: فهي لا تملك صلاحية الوصول إلى this لأنها قد لا تُنشئ instance جديدة على الإطلاق. وبدلًا من ذلك، يجب أن تُعيد كائنًا بشكل صريح:

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 مفيدة عندما تحتاج إلى التحكم في إنشاء instance، مثل إرجاع كائنات مخزّنة مؤقتًا، أو تنفيذ تجمعات الكائنات، أو تحديد النوع الفرعي الذي يجب إنشاءه بناءً على معلمات الإدخال.

challenge icon

التحدي

سهل

لننشئ نظام إشعارات يستخدم مُنشئات المصنع لإنشاء أنواع مختلفة من الإشعارات استنادًا إلى إدخال نصي بسيط.

ستنشئ ملفين لتنظيم التعليمات البرمجية الخاصة بك:

  • notification.dart: عرّف فئة Notification التي تعمل كـ base لجميع أنواع الإشعارات. يجب أن تحتوي فئتك على:
    • حقل String message
    • مُنشئ named خاص Notification._internal يقوم بتهيئة message
    • مُنشئ factory Notification(String type, String message) يعيد أنواعًا فرعية مختلفة من الإشعارات استنادًا إلى المعامل type:
      • إذا كان type هو 'email'، فأعد EmailNotification
      • إذا كان type هو 'sms'، فأعد SMSNotification
      • otherwise، أعد PushNotification
    • أسلوب send() يطبع Sending: [message]

في الملف نفسه، أنشئ ثلاث فئات فرعية تمتد من Notification:

  • EmailNotification: نفّذ override للأسلوب send() ليطبع Email: [message]
  • SMSNotification: نفّذ override للأسلوب send() ليطبع SMS: [message]
  • PushNotification: نفّذ override للأسلوب send() ليطبع Push: [message]

تحتاج كل فئة فرعية إلى مُنشئ يأخذ message ويمرره إلى الفئة الأصل باستخدام super._internal(message).

  • main.dart: استورد فئة الإشعارات وأنشئ ثلاثة إشعارات باستخدام مُنشئ factory:
    • إشعار Email برسالة '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: Create an SMS notification with message 'Your code is 1234'
  
  // TODO: Create a push notification with message 'New update available'
  
  // TODO: استدعِ send() على كل إشعار بالترتيب
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Dart عبر الإنترنت