Menu
CoddyTech
flag Ar iconالعربيةdown icon

نمط المصنع (Factory Pattern)

جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 53 من 70.

يُعد نمط Factory نمطًا إنشائيًا يُفوِّض إنشاء الكائنات إلى أسلوب أو فئة منفصلة. بدلًا من استخدام new مباشرةً في التعليمات البرمجية، تطلب من مصنع إنشاء الكائنات نيابةً عنك. يؤدي هذا إلى توحيد منطق الإنشاء ويجعل تعليماتك البرمجية أكثر مرونة.

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

// بدون Factory - منطق الإنشاء المتناثر
IDocument doc;
if (type == "pdf")
    doc = new PdfDocument();
else if (type == "word")
    doc = new WordDocument();

تُغلِّف دالة المصنع عملية اتخاذ هذا القرار في مكان واحد:

public interface IDocument
{
    void Open();
}
public class PdfDocument : IDocument
{
    public void Open() => Console.WriteLine("Opening PDF");
}
public class WordDocument : IDocument
{
    public void Open() => Console.WriteLine("Opening Word");
}
public class DocumentFactory
{
    public IDocument Create(string type)
    {
        switch (type)
        {
            case "pdf":
                return new PdfDocument();
            case "word":
                return new WordDocument();
            default:
                throw new ArgumentException("Unknown type");
        }
    }
}

الآن يطلب كود العميل ببساطة ما يحتاج إليه دون معرفة الفئات الملموسة:

var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open();  // فتح PDF

تتألق نمطية المصنع عندما تحتاج إلى إضافة أنواع جديدة لاحقًا. تتطلب إضافة SpreadsheetDocument تغييرات في المصنع فقط، وليس في كل مكان تُنشأ فيه المستندات. يجعل هذا الفصل قاعدة التعليمات البرمجية أسهل في الصيانة والاختبار.

challenge icon

التحدي

سهل

لنُنشئ نظام إشعارات باستخدام نمط Factory. بدلًا من إنشاء أنواع الإشعارات المختلفة مباشرةً في أنحاء الشيفرة، ستُركّز منطق الإنشاء في فئة مصنع تقرر نوع الإشعار الذي ستنشئه استنادًا إلى معرّف نصي بسيط.

ستنظّم شيفرتك عبر ثلاثة ملفات:

  • Notification.cs: عرّف واجهة INotification في مساحة الأسماء Notifications مع أسلوب واحد هو Send(string message) يعيد قيمة نصية. ثم أنشئ ثلاث فئات تنفّذ هذه الواجهة:
    • EmailNotification - تعيد "Email: {message}"
    • SmsNotification - تعيد "SMS: {message}"
    • PushNotification - تعيد "Push: {message}"
  • NotificationFactory.cs: أنشئ فئة NotificationFactory في مساحة الأسماء نفسها، مع أسلوب Create(string type) يعيد INotification المناسب بناءً على سلسلة النوع:
    • "email" يعيد كائنًا من EmailNotification
    • "sms" يعيد كائنًا من SmsNotification
    • "push" يعيد كائنًا من PushNotification
    بالنسبة إلى أي نوع غير معروف، أعد EmailNotification كافتراضي.
  • Program.cs: اجمع كل شيء معًا من خلال إنشاء نسخة من المصنع واستخدامها لإنشاء الإشعارات استنادًا إلى الإدخال. يتولى المصنع جميع قرارات الفئة المحددة التي ينبغي إنشاء نسخة منها.

ستتلقى مدخلين:

  • نوع الإشعار (مثلًا: sms)
  • الرسالة المراد إرسالها (مثلًا: Your order has shipped)

استخدم مصنعك لإنشاء نوع الإشعار المناسب، ثم استدعِ أسلوب Send الخاص به مع الرسالة واطبع النتيجة.

على سبيل المثال، إذا كان الإدخالان هما push وMeeting in 5 minutes، فينبغي أن يكون الناتج:

Push: Meeting in 5 minutes

لاحظ أن شيفرتك الرئيسية لا تستخدم مطلقًا new EmailNotification() أو ما شابه ذلك، بل تطلب ببساطة من المصنع ما تحتاج إليه. وإذا أضفت لاحقًا SlackNotification، فلن تحتاج إلا إلى تحديث المصنع، وليس كل موضع ينشئ الإشعارات!

جرّب بنفسك

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // اقرأ الإدخال
        string type = Console.ReadLine();
        string message = Console.ReadLine();

        // TODO: أنشئ مثيلاً من NotificationFactory

        // TODO: استخدم المصنع لإنشاء الإشعار المناسب

        // TODO: استدعِ الطريقة Send واطبع النتيجة
    }
}
quiz iconاختبر نفسك

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

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

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