كيف تتذكر الفرق بين نمط Abstract Abstract ونمط Method Factory في أنماط التصميم؟


الاجابه 1:

نمط تصميم المصنع:

  • وهو يقع تحت نمط التصميم الإبداعي. يقول النموذج المصنع أنه سيتم معالجة إنشاء كائن بواسطة فئة أخرى باستخدام نوع الإدخال.

مزايا:

  • انها تسمح فضفاضة اقتران.

متى يجب استخدام نمط تصميم المصنع؟

  • يتم استخدام نمط تصميم المصنع عندما يكون لدينا فئة فائقة الجودة مع فئات فرعية متعددة وبناءً على المدخلات ، نحتاج إلى إرجاع أحد الفئات الفرعية. تعامل مع VegFood و NonVegFood و ItalianFood على أنها ثلاث فئات ذات فئتها الفائقة هي Food.If يسأل العميل "Veg" ، فإن طريقة المصنع ستعيد فئة "VegFood".

مثال:

الخطوة 1: إنشاء فئة مجردة "الغذاء" الذي يحتوي على اثنين من المتغيرات تسمى "billPerPerson" و "العناصر".

 مجردة الطبقة العامة الغذاء

{
    billPerPerson مزدوج محمي ؛
    مجموعة البنود المحمية.

    طعام عام (billPerPerson مزدوج)

    {
        this.billPerPerson = billPerPerson.
        this.items = new HashSet <> ()؛
    }

    getBill العامة ()

    {
        إرجاع billPerPerson ؛

    }

    مجموعة getItems العامة ()
    {
        البنود العودة ؛
    }
}

الخطوة 2: إنشاء فئات ملموسة التي تمتد فئة مجردة "الغذاء"

VegFood الطبقة العامة يمتد الغذاء
{
    VegFood العامة ()

    {
        فائقة (100)؛
        items.add ( "بكلامك تتبرر وبكلامك")؛
        items.add ( "دوسة")؛
        items.add ( "فادا")؛
    }
}

الطبقة العامة NonVegFood يمتد الغذاء
{
    NonVegFood العامة ()
    {
        فائقة (120)؛
        items.add ( "البرياني")؛
        items.add ("دجاج 65") ؛
    }
}

الخطوة 3: إنشاء FoodServer وهي فئة مصنع لإنشاء كائن للخرسانة بناءً على المعلومات:

الطبقة العامة FoodServer

{
    ثابت الغذاء العام getFood (سلسلة foodType)

    {
        إذا (foodType.equals ("veg"))
        {
            إرجاع VegFood () جديد ؛
        }
        آخر إذا (foodType.equals ("non veg"))
        {
            إرجاع NonVegFood () جديد ؛
        }
        آخر
        {
            System.out.println ("نحن لا نخدم" + foodType) ؛
            عودة لاغية
        }
    }
}

الخطوة 4: الفئة الرئيسية "العميل" للحصول على الغذاء المطلوب بناءً على نوع الطعام.

عميل فئة عامة
{
    ثابت الفراغ الرئيسي العام (سلسلة [] الحجج)
    {
        customer1Food = FoodServer.getFood ("veg") ؛
        System.out.println ( "Customer1")؛
        System.out.println ("Items:" + customer1Food.getItems (). toString ())؛
        System.out.println ("Bill:" + customer1Food.getBill ()) ؛
        customer2Food = FoodServer.getFood ("non veg")؛
        System.out.println ( "Customer1")؛
        System.out.println ("Items:" + customer2Food.getItems (). toString ())؛
        System.out.println ("Bill:" + customer2Food.getBill ()) ؛
    }
}

نمط تصميم مصنع مجردة:

  • إنه يقع تحت Creational Design Pattern.It يوفر واجهة لإنشاء عائلات من الكائنات ذات الصلة أو التابعة دون تحديد فئات ملموسة. أنماط مصنع الملخص هو مصنع السوبر الذي سيعود أفضل مصنع على أساس المدخلات.أنها بمثابة مصنع للمصانع يستخلص العميل من معرفة أي مصنع سيعاد.

مثال على الحياة الحقيقية:

  • ضع في اعتبارك مصنعًا كبيرًا يقوم بتصنيع الصابون. ولن يقوم المصنع بتصنيع كل الأشياء المطلوبة للصابون. وسيحتوي على العديد من المصانع الفرعية التي تصنع "لوح الصابون" و "غلاف الصابون" ، إلخ. سيتم تجميع كل شيء من المصنع الرئيسي.

متى يجب استخدام نمط تصميم مصنع الخلاصة؟

  • يجب أن يكون العميل مستقلًا عن كيفية إنشاء الكائنات وعن أي كائن من فئة يتم إنشاؤه. يكون ذلك مفيدًا عندما يحتاج كائن إلى إنشاء من عائلة من الفئات.

ملاحظة: قد يكون الأمر مربكًا ، لذا يرجى مشاهدة مقاطع الفيديو التي قمت بتضمينها في نهاية هذه الصفحة.

مثال:

الخطوة 1:

  • إنشاء واجهة تسمى "دورة".
دورة واجهة عامة
{
    سلسلة عامة getCourseName ()؛
}

الخطوة 2:

  • إنشاء فئات محددة تنفذ واجهة "الدورة التدريبية".
فئة برمجة عامة تنفذ دورة تدريبية
{
    @تجاوز
    سلسلة عامة getCourseName ()
    {
       إرجاع "Java" ؛
    }
}

الطبقة العامة NonProgrammingCourse تنفذ الدورة
{
    @تجاوز
    سلسلة عامة getCourseName ()
    {
        إرجاع "DSP" ؛
    }
}

الخطوه 3:

  • إنشاء واجهة تسمى "المصدر".
مصدر واجهة عامة
{
    سلسلة عامة getSourceName ()؛
}

Step4:

  • قم بإنشاء فئات محددة تنفذ واجهة "المصدر".
الطبقة العامة غير متصل تنفذ المصدر
{
    @تجاوز
    سلسلة عامة getSourceName ()
    {
        إرجاع "الكتب" ؛
    }
}

الطبقة العامة على الإنترنت تنفذ المصدر
{
    @تجاوز
    سلسلة عامة getSourceName ()
    {
        إرجاع "YouTube" ؛
    }
}

الخطوة 5:

  • إنشاء فئة مجردة "SourceCourseFactory".
فئة مجردة العامة
{
    الملخص العام getSource المصدر (String sourceType) ؛
    
    مجردة عامة دورة getCourse (سلسلة بالطبع) ؛
}

الخطوة 6:

  • إنشاء فئة مصنع "CourseFactory" يمتد "SourceCourseFactory"
الطبقة العامة CourseFactory يمتد SourceCourseFactory
{
    @تجاوز
    المصدر العام getSource (String sourceType)
    {
        عودة لاغية
    }

    @تجاوز
    دورة getCourse العامة (String courseType)
    {
        إذا (courseType.equalsIgnoreCase ( "برمجة"))
        {
            إرجاع ProgrammingCourse جديد () ؛
        }
        آخر إذا (courseType.equalsIgnoreCase ("غير البرمجة"))
        {
            إرجاع جديد NonProgrammingCourse () ؛
        }
        آخر
        {
            عودة لاغية
        }
    }
}

الخطوة 7:

  • إنشاء فئة مصنع "SourceFactory" يمتد "SourceCourseFactory"
الطبقة العامة SourceFactory تمتد SourceCourseFactory
{

    @تجاوز
    المصدر العام getSource (String sourceType)
    {
        إذا (sourceType.equalsIgnoreCase ( "عبر الإنترنت"))
        {
            إرجاع جديد عبر الإنترنت () ؛
        }
        آخر إذا (sourceType.equalsIgnoreCase ("غير متصل"))
        {
            إرجاع جديد Offline ()؛
        }
        آخر
        {
            عودة لاغية
        }
    }

    @تجاوز
    دورة getCourse العامة (String courseType)
    {
       عودة لاغية
    }
    
}

الخطوة 8:

  • قم بإنشاء فئة رئيسية تستدعي فئة Abstract Factory للحصول على كائن فئة Factory الحقيقي ثم تستخدم هذا الكائن لتنفيذ عمليات أخرى.
 الطبقة العامة ExampleMain
{
    ثابت الفراغ الرئيسي العام (سلسلة [] الحجج)
    {
        SourceCourseFactory course = FactoryCreator.getSourceCourseFactory ("course") ؛

        System.out.println (course.getCourse ( "برمجة") getCourseName ())؛

        SourceCourseFactory source = FactoryCreator.getSourceCourseFactory ("source")؛
        System.out.println (source.getSource ( "عبر الإنترنت") getSourceName ())؛

    }
}