By using this site, you agree to the Privacy Policy and Terms of Use.
موافق
عرب فلاترعرب فلاتر
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
قراءة: الدرس 48: شرح مفهوم الـ Factory Constructor في لغة دارت (Dart)
شارك
تسجيل الدخول
إشعار أظهر المزيد
Aa
عرب فلاترعرب فلاتر
Aa
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
Search

أقسام الموقع

استكشف جميع أقسام الموقع
قسم Dart في موقع عرب فلاتر

Dart

59 مقالات
قسم Widgets في موقع عرب فلاتر

Widgets

104 مقالات
قسم Packages في موقع عرب فلاتر

Packages

19 مقالات
قسم Tutorials في موقع عرب فلاتر

Tutorials

22 مقالات

أخر المواضيع

استكشف أخر المواضيع المنشورة
شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
Tutorials

شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا

5
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
Tutorials

حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر

10
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
Tutorials

أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات

18
لديك حساب موجود؟ تسجيل الدخول
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
© جميع الحقوق محفوظة موقع عرب فلاتر 2023
عرب فلاتر > Dart > الدرس 48: شرح مفهوم الـ Factory Constructor في لغة دارت (Dart)
Dart

الدرس 48: شرح مفهوم الـ Factory Constructor في لغة دارت (Dart)

عبدالله يوسف
أخر تحديث 2024/11/15
بواسطة عبدالله يوسف اضف تعليق 6 دقيقة للقراءة 2820 مشاهدات 5
شارك
شرح مفهوم الـ Factory Constructor في لغة دارت (Dart)
شرح مفهوم الـ Factory Constructor في لغة دارت (Dart)
شارك

خدماتنا البرمجية – عرب فلاتر🚀

خدماتنا البرمجية – عرب فلاتر

في لغة برمجة دارت (Dart)، نجد نوعًا خاصًا من الـ Constructors يُعرف بالـ “Factory Constructor”، وهو نوع من الـ Constructors يوفر مرونة إضافية في عملية إنشاء الكائنات. حتى الآن، تعلمنا كيفية استخدام الـ “Generative Constructors” الذي يقوم بإنشاء نسخة جديدة من الكلاس فقط. ومع ذلك، يمكن للـ “Factory Constructor” أن يُستخدم لإنشاء نسخة من الكلاس نفسه، أو حتى لإنشاء نسخة من كلاس فرعي. بالإضافة إلى ذلك، يُمكن استخدامه أيضًا لإرجاع نسخة مخبأة (Cached Instance) من الكلاس.

المحتويات
قواعد الـ Factory Constructor في دارت:مثال 1: بدون الـ Factory Constructorمثال 2: باستخدام الـ Factory Constructorمثال 3: الـ Factory Constructor في دارتالمثال 4: الـ Factory Constructor في دارت

قواعد الـ Factory Constructor في دارت:

  1. يجب أن يُرجع الـ Factory Constructor نسخة من الكلاس أو الكلاس الفرعي.
  2. لا يمكن استخدام كلمة “this” داخل الـ Factory Constructor.
  3. يمكن أن يكون الـ Factory Constructor بأسماء أو بدون أسماء ويمكن استدعاؤه كأي Constructor عادي.
  4. لا يمكن للـ Factory Constructor الوصول إلى أعضاء الكلاس.

مثال 1: بدون الـ Factory Constructor

في هذا المثال، لدينا كلاس تسمى (Area) يحتوي على خصائص نهائية (final) هي الطول والعرض والمساحة. عند تمرير الطول والعرض إلى الـ Constructor، يتم حساب المساحة وتخزينها في خاصية المساحة.

class Area {
  final int length;
  final int breadth;
  final int area;

  // Initializer list 
  const Area(this.length, this.breadth) : area = length * breadth;
}

void main() {
  Area area = const Area(10, 20);
  print("المساحة هي: ${area.area}");

  // لاحظ أن هنا قيمة سالبة
  Area area2 = const Area(-10, 20);
  print("المساحة هي: ${area2.area}");
}

نتيجة الكود:

المساحة هي: 200
المساحة هي: -200

في هذا المثال، تم إنشاء كائنين من الكلاس (Area)، الأول بقيم طول وعرض إيجابية والثاني بقيمة طول سالبة. يُلاحظ أن الكائن الثاني لديه قيمة سالبة للمساحة، وذلك بسبب أننا لم نُعالج القيم المدخلة في الـ Constructor.


مثال 2: باستخدام الـ Factory Constructor

في هذا المثال، يتم استخدام الـ Factory Constructor للتحقق من صحة القيم المدخلة. إذا كانت القيمة صالحة، فسيتم إرجاع نسخة جديدة من الكلاس. وإذا كانت القيمة غير صالح، فسيتم ظهور استثناء (Exception).

class Area {
  final int length;
  final int breadth;
  final int area;

  // private constructor
  const Area._internal(this.length, this.breadth) : area = length * breadth;

  // Factory constructor
  factory Area(int length, int breadth) {
    if (length < 0 || breadth < 0) {
      throw Exception("يجب أن تكون قيمة الطول والعرض إيجابية");
    }
    // إعادة التوجيه إلى الـ Constructor الخاص
    return Area._internal(length, breadth);
  }
}

void main() {
  // هذا يعمل
  Area area = Area(10, 20);
  print("المساحة هي: ${area.area}");

  // لاحظ أن هنا قيمة سالبة
  Area area2 = Area(-10, 20);
  print("المساحة هي: ${area2.area}");
}

نتيجة الكود:

المساحة هي: 200
Unhandled exception:
Exception: يجب أن تكون قيمة الطول والعرض إيجابية

في هذا المثال، أُنشئ كائنين من كلاس (Area)، الأول بقيم طول وعرض إيجابية والثاني بقيمة طول سالبة. يتم ظهور استثناء (Exception) في الكائن الثاني بسبب عدم صحة القيم المدخلة في الـ Constructor.


مثال 3: الـ Factory Constructor في دارت

في هذا المثال، يوجد كلاس يسمى (Person) يحتوي على خاصيتين هما الاسم الأول والاسم الأخير، ويحتوي على Constructor عادي (Generative Constructor) والـ Factory Constructor. الـ Factory Constructor يقوم بإنشاء كائن من كلاس باستخدام Map.

class Person {
  String firstName;
  String lastName;

  // constructor
  Person(this.firstName, this.lastName);

  // factory constructor Person.fromMap
  factory Person.fromMap(Map<String, Object> map) {
    final firstName = map['firstName'] as String;
    final lastName = map['lastName'] as String;
    return Person(firstName, lastName);
  }
}

void main() {
  // إنشاء كائن شخص
  final person = Person('جون', 'دو');

  // إنشاء كائن شخص من Map
  final person2 = Person.fromMap({'firstName': 'هاري', 'lastName': 'بوتر'});

  // طباعة الاسم الأول والأخير
  print("من الـ Constructor: ${person.firstName} ${person.lastName}");
  print("من الـ Factory Constructor: ${person2.firstName} ${person2.lastName}");
}

نتيجة الكود:

من الـ Constructor: جون دو
من الـ Factory Constructor: هاري بوتر

في الدالة الرئيسية (main)، تم إنشاء كائنين، الأول باستخدام الـ Constructor العام (Generative Constructor) والثاني باستخدام الـ Factory Constructor، وتم طباعة الاسم الأول والأخير لكل كائن.


المثال 4: الـ Factory Constructor في دارت

في هذا المثال، دعونا ننظر في كلاس يُدعى “Shape” (الشكل) مع كلاسين فرعيين، “Circle” (الدائرة) و “Rectangle” (المستطيل). كل كلاس فرعي لديه الـ Factory Constructor خاص به لإنشاء مثيلات من الشكل المُقابل.

abstract class Shape {
  void printArea();
}

class Circle implements Shape {
  final double radius;

  Circle(this.radius);

  factory Circle.fromDiameter(double diameter) {
    return Circle(diameter / 2);
  }

  @override
  void printArea() {
    final area = 3.14 * radius * radius;
    print('مساحة الدائرة: $area');
  }
}

class Rectangle implements Shape {
  final double length;
  final double width;

  Rectangle(this.length, this.width);

  factory Rectangle.fromSides(double side1, double side2) {
    return Rectangle(side1, side2);
  }

  @override
  void printArea() {
    final area = length * width;
    print('مساحة المستطيل: $area');
  }
}

void main() {
  final circle = Circle.fromDiameter(10);
  circle.printArea();

  final rectangle = Rectangle.fromSides(5, 8);
  rectangle.printArea();
}

نتيجة الكود:

مساحة الدائرة: 78.5
مساحة المستطيل: 40.0

يُظهر هذا المثال كيف يمكن استخدام الـ Factory Constructor في لغة دارت لإنشاء أشكال مختلفة باستخدام منطق تهيئة مختلف استنادًا إلى المعلمات المقدمة.


إن الـ Factory Constructor في دارت يُمثل أحد الأدوات القوية والمرنة في إنشاء الكائنات وإدارتها. يسمح هذا النوع من الـ Constructors بتحقيق سيناريوهات مختلفة لإنشاء الكائنات بناءً على الحاجة. سواء كنت تحتاج إلى إنشاء نسخ جديدة من الكلاس أو إعادة استخدام نسخ مخبأة، يُمكن للـ Factory Constructor أن يكون أداة قوية في مجموعة أدواتك لتطوير تطبيقات دارت بشكل أكثر كفاءة.

 

Arab Flutter Community 🚀

انضم إلى مجتمع Arab Flutter
شارك هذا المقال
فيسبوك تويتر Whatsapp Whatsapp لينكد ان تلغرام نسخ الرابط
المقال السابق شرح مفهوم الـ Mixin في لغة دارت (Mixin in Dart) الدرس 47: شرح مفهوم الـ Mixin في لغة دارت (Mixin in Dart)
المقال التالي شرح مفهوم الـ Generics في لغة دارت (Generics In Dart) الدرس 49: شرح مفهوم الـ Generics في لغة دارت (Generics In Dart)
Avatar of عبدالله يوسف
بواسطة عبدالله يوسف Founder and CEO at ArabFlutter
تابع:
أنا عبدالله يوسف، مهندس مصري ومؤسس موقع عرب فلاتر، ملهم بشغف التكنولوجيا والإبداع. كمصمم مواقع ومبرمج تطبيقات موبايل باستخدام Flutter، أستمتع بخلق عوالم رقمية فريدة ومبتكرة. تتجلى مواهبي في تصميم وتطوير واجهات مستخدم تفاعلية، حيث يمزج الجانب الجمالي بالدقة الهندسية. ما يميزني هو إلمامي الواسع بتقنيات البرمجة والتصميم، ومقدرتي على تطوير تطبيقات متنوعة عبر منصات مختلفة. أعتبر نفسي مبدعًا وملتزمًا، حيث أسعى دائمًا لتحقيق تحسين مستمر في مهاراتي وتقنياتي. أستمتع بتحديات العمل الجماعي وأؤمن بأهمية الابتكار والتطور. بفضل إبداعي والتزامي، أسعى لتقديم حلول فعّالة تلبي توقعات العملاء وتفوق عن المألوف.
اترك تعليقا اترك تعليقا

اترك تعليقاً إلغاء الرد

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
Tutorials
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
Tutorials
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
Tutorials
طريقة انشاء المجلدات باستخدام Dart
طريقة انشاء المجلدات باستخدام كود Dart تلقائيًا
Tutorials

مقالات ذات الصلة

اطلع على المزيد من المقالات المتعلقة بهذا الموضوع!
شرح العوازل في لغة دارت (Isolates in Dart)
Dart

شرح العوازل في لغة دارت (Isolates in Dart)

8
شرح الـ Stream في لغة دارت (Stream in Dart)
Dart

الدرس 57: شرح الـ Stream في لغة دارت (Stream in Dart)

8
شرح عبارات async & await في لغة دارت (Dart)
Dart

الدرس 56: شرح عبارات async & await في لغة دارت (Dart)

6
شرح مفهوم الـ Future في لغة دارت (Future In Dart)
Dart

الدرس 55: شرح مفهوم الـ Future في لغة دارت (Future In Dart)

6
شرح مفهوم الـ Asynchronous في لغة دارت (Dart)
Dart

الدرس 54: شرح مفهوم الـ Asynchronous في لغة دارت (Dart)

6
10 تمارين محلولة على Null Safety في لغة دارت Dart
Dart

الدرس 53: 10 تمارين محلولة على Null Safety في لغة دارت Dart

5
أظهر المزيد
شعار موقع عرب فلاتر شعار موقع عرب فلاتر

About US

Quick Links

  • خدماتنا
  • من نحن
  • اتصل بنا
  • اتفاقية استخدام
  • سياسة الخصوصية
© جميع الحقوق محفوظة موقع عرب فلاتر 2023
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
adbanner
تم اكتشاف مانع إعلانات
مرحبًا، يرجى إيقاف مانع الإعلانات. الإعلانات تُساهم في دعم موقعنا وتغطية جزء من تكاليف الاستضافة وتطوير المحتوى. شكرًا لتفهمك ودعمك.
Okay, I'll Whitelist
Welcome Back!

Sign in to your account

هل نسيت كلمة المرور؟