أنماط التصميم في C# مع أمثلة: من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في C# مع أمثلة: من الألف إلى الياء



أنماط التصميم (design patterns) هي حلول مجربة للمشكلات النمطية التي تنشأ أثناء تطوير البرمجيات. إنها ليست كودًا جاهزًا، بل تمثل قوالب يمكن تكييفها لتناسب موقفًا معينًا. بالنسبة لمطور C#، فإن معرفة الأنماط ليست مجرد إضافة في السيرة الذاتية، بل ضرورة لإنشاء بنية مرنة وقابلة للصيانة والتوسع.



في هذه المقالة، سنستعرض ثلاث مجموعات رئيسية من الأنماط وفقًا لتصنيف GoF (Gang of Four): الأنماط الإنشائية والهيكلية والسلوكية. سيتم دراسة كل نمط بمثال عملي على C# (.NET).



الأنماط الإنشائية (Creational Patterns)



تدير هذه الأنماط عملية إنشاء الكائنات، مما يجعل النظام مستقلاً عن طريقة إنشائها. سنستعرض اثنين من أشهرها.



المفرد (Singleton)

يضمن وجود مثيل واحد فقط للفئة، ويوفر نقطة وصول عالمية إليه. في C#، للعمل الآمن في بيئة متعددة الخيوط، يُستخدم Lazy<T>.



public sealed class Logger{    private static readonly Lazy<Logger> _instance =         new Lazy<Logger>(() => new Logger());

public static Logger Instance => _instance.Value;

private Logger() { }

public void Log(string message) { Console.WriteLine($"[{DateTime.Now}] {message}"); }}

// الاستخدامLogger.Instance.Log("تم تشغيل التطبيق");


طريقة المصنع (Factory Method)

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



public interface ITransport{    void Deliver();}

public class Truck : ITransport{ public void Deliver() => Console.WriteLine("التوصيل براً");}

public class Ship : ITransport{ public void Deliver() => Console.WriteLine("التوصيل بحراً");}

public abstract class Logistics{ public abstract ITransport CreateTransport();

public void PlanDelivery() { var transport = CreateTransport(); transport.Deliver(); }}

public class RoadLogistics : Logistics{ public override ITransport CreateTransport() => new Truck();}

// الاستخدامLogistics logistics = new RoadLogistics();logistics.PlanDelivery(); // الإخراج: التوصيل براً


الأنماط الهيكلية (Structural Patterns)



تحدد هذه الأنماط طرق بناء العلاقات بين الكائنات، مما يوفر المرونة والكفاءة في البنية.



المهايئ (Adapter)

يسمح للكائنات ذات الواجهات غير المتوافقة بالعمل معًا. يُستخدم غالبًا عند التكامل مع كود قديم أو مكتبات خارجية.



// الواجهة المستهدفة التي يتوقعها العميلpublic interface IModernPrinter{    void Print(string text);}

// الفئة القديمة ذات الواجهة غير المتوافقةpublic class OldPrinter{ public void PrintOldStyle(string message) { Console.WriteLine($"طابعة قديمة: {message}"); }}

// المهايئpublic class PrinterAdapter : IModernPrinter{ private readonly OldPrinter _oldPrinter;

public PrinterAdapter(OldPrinter oldPrinter) { _oldPrinter = oldPrinter; }

public void Print(string text) { _oldPrinter.PrintOldStyle(text); }}

// الاستخدامIModernPrinter printer = new PrinterAdapter(new OldPrinter());printer.Print("مرحباً بالعالم!"); // الإخراج: طابعة قديمة: مرحباً بالعالم!


المزخرف (Decorator)

يضيف ديناميكيًا مسؤوليات جديدة إلى الكائن دون تغيير كوده. وهو بديل مرن للوراثة.



public interface ICoffee{    double GetCost();    string GetDescription();}

public class SimpleCoffee : ICoffee{

المدونات

توصيات الكتب