نمط المصنع (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 تغييرات في المصنع فقط، وليس في كل مكان تُنشأ فيه المستندات. يجعل هذا الفصل قاعدة التعليمات البرمجية أسهل في الصيانة والاختبار.
التحدي
سهللنُنشئ نظام إشعارات باستخدام نمط 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 واطبع النتيجة
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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# عبر الإنترنت