Singleton Design Pattern
Wednesday, August 13, 2008 | Labels: C#, Design Patterns | |المشكلة :
أحياناً ما تحتاج لإن يكون ال Class الذي قمت بانشائه لا يمكن تعريف سوى نسخة أو Object واحد فقط منه ، وتحتاج إلى مثل هذه العملية في حالة كود هذا ال Class لا بد أن يكون موجوداً مرة واحدة في البرنامج وتظل قيمه مقروءة لجميع المستخدمين من أي مكان .
المشكلة ليست في جعل ال Class لا يتم سوى عمل نسخة واحدة منه ، بل إن هذا يتم بكل بساطة باستخدام الكلمة المحجوزة Sealed ، ولكن المشكلة تكمن في أنك عندما تريد أن تستخدم نسخة أخرى فإنك لن تستطيع ، وبذا لن يمكنك الاستفادة منه في كل مكان
في هذه الحالة نلجأ لما يسمى Singleton .
الشرح :
في البداية سوف ننشأ Class وليكن اسمه Singleton .
وفي كلا الأحوال لا بد للمنشىء constructor أن يكون private لكي لا يتمكن أحد من عمل نسخة جديدة منه .
وسنعرف نسخة من ال Class داخل ال Class نفسه بالشكل التالي :
private readonly Singleton instance; |
ومن ثم سوف أقوم بعمل فنكشن استخدمها للحصول على هذه النسخة من أي مكان في البرنامج بالشكل التالي :
public Singleton getInstance { if (instance ==null) instance = new Singleton(); return instance } |
والآن هناك طريقتين لتطبيق هذه التقنية ، الطريقة السابقة التي ذكرناها وبامكانها العمل على أي لغة برمجة - بغض النظر عن أنني استخدم C# في الشرح - ، أما الطريقة الثانية فهي تتطلب لغة يمكنها قراءة static من أي مكان وهو ما يتوفر مثلاً في الجافا أو ال C# ولا يتوفر في ال C++ .
الطريقة الثانية تعتمد على الغاء الفنكشن getInstance والاعتماد على أن بامكان اللغة تعريف new من المتغير وقت التعريف ، ليصبح أمر التعريف بالشكل التالي :
public static readonly Singleton instance = new Singleton(); |
وفي هذه الحالة قم دائماً بقراءة instance دون الحاجة إلى التعريف لإنها static .
وهذه صورة توضح التقنيتن المشروحتين :