نمط المصنع (Factory Pattern)
جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 53 من 70.
إن نمط Factory هو نمط إنشائي يفوّض إنشاء الكائنات إلى method أو class منفصل. وبدلًا من استخدام new مباشرةً في التعليمات البرمجية، تطلب من factory إنشاء الكائنات نيابةً عنك. وهذا يُركّز منطق الإنشاء ويجعل تعليماتك البرمجية أكثر مرونة.
تخيّل سيناريو تحتاج فيه إلى إنشاء أنواع مختلفة من المستندات. من دون factory، يصبح الكود الخاص بك مقترنًا بشكل وثيق بفئات محددة:
// بدون Factory - منطق الإنشاء المتناثر
IDocument doc;
if (type == "pdf")
doc = new PdfDocument();
else if (type == "word")
doc = new WordDocument();تُجسّد factory عملية اتخاذ هذا القرار في مكان واحد:
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)
{
return type switch
{
"pdf" => new PdfDocument(),
"word" => new WordDocument(),
_ => throw new ArgumentException("Unknown type")
};
}
}الآن يطلب كود العميل ببساطة ما يحتاج إليه دون معرفة الأصناف الملموسة:
var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open(); // فتح PDFيتألق نمط Factory عندما تحتاج إلى إضافة أنواع جديدة لاحقًا. تتطلب إضافة SpreadsheetDocument إجراء تغييرات في factory فقط، وليس في كل مكان يتم فيه إنشاء المستندات. يجعل هذا الفصل قاعدةَ التعليمات البرمجية لديك أسهل في الصيانة والاختبار.
التحدي
سهللنَبْنِ نظامًا للإشعارات باستخدام نمط Factory. بدلًا من إنشاء أنواع الإشعارات المختلفة مباشرةً في جميع أنحاء التعليمات البرمجية، ستُركّز منطق الإنشاء في فئة factory تحدد الإشعار الذي يجب إنشاؤه استنادًا إلى معرّف نصي بسيط.
ستنظّم تعليماتك البرمجية عبر ثلاثة ملفات:
Notification.cs: عرّف واجهةINotificationفي مساحة الأسماءNotificationsمع method واحدة هيSend(string message)تُرجع سلسلة نصية. ثم أنشئ ثلاث فئات تطبّق هذه الواجهة:EmailNotification- تُرجع"Email: {message}"SmsNotification- تُرجع"SMS: {message}"PushNotification- تُرجع"Push: {message}"
NotificationFactory.cs: أنشئ فئةNotificationFactoryفي مساحة الأسماء نفسها، مع method باسمCreate(string type)تُرجعINotificationالمناسبة استنادًا إلى سلسلة النوع:"email"تُرجعEmailNotification"sms"تُرجعSmsNotification"push"تُرجعPushNotification
EmailNotificationباعتباره القيمة الافتراضية.Program.cs: اجمع كل شيء معًا من خلال إنشاء instance من factory واستخدامها لإنشاء الإشعارات استنادًا إلى الإدخال. يتولى factory جميع القرارات المتعلقة بالفئة الفعلية التي ينبغي إنشاء instance منها.
ستتلقى مدخلين:
- نوع الإشعار (مثلًا:
sms) - الرسالة المراد إرسالها (مثلًا:
Your order has shipped)
استخدم factory لإنشاء نوع الإشعار المناسب، ثم استدعِ method الخاصة به Send مع الرسالة واطبع result.
على سبيل المثال، إذا كانت المدخلات هي push وMeeting in 5 minutes، فينبغي أن يكون الناتج:
Push: Meeting in 5 minutesلاحظ أن التعليمات البرمجية الرئيسية لا تستخدم أبدًا new EmailNotification() أو ما شابه؛ فهي تطلب ببساطة من factory ما تحتاج إليه. وإذا أضفت لاحقًا SlackNotification، فلن تحتاج إلا إلى تحديث factory، وليس كل موضع ينشئ الإشعارات!
جرّب بنفسك
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 واطبع النتيجة
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List10أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singleton الآمن للخيوط (Thread-Safe)نمط المصنع (Factory Pattern)نمط المراقب (Events)نمط الاستراتيجية (Strategy Pattern)2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injectionتدرّب بنفسك: مترجم C# عبر الإنترنت