Sunday, December 9, 2012

Singleton Pattern

التعريف :

في بعض الأحيان نحتاج الى كائن وحيد او مايسمى بالمثيل (instance) لأجل كلاس (class) معين .بحيث يكون الكلاس مسؤول على خلق instance وحيد من نوع ثابت static وفي نفس الوقت يزود ممر مفتوح او نقطة عالمية(global point) لأجل الوصول الى instance المخلوق.هذه الهيكلية تعرف كنمط أساسي يسمى Singleton Pattern  وهو من أبسط أنماط
Gang of Four  .وحسب تعريف (GoF):

Ensure a class has only one instance and provide a global point of access to it.

القيود :

  • التأكد من خلق instance وحيد لأجل كلاس class.
  • تزويد نقطة او ممر مفتوح global point لأجل الوصول الى instance.

التنفيذ :

لأجل تنفيذ هيكلية نمط Singleton يتطلب :
  1. خلق كلاس ونسميه Singleton.
  2. خلق member من صنف static ويحمل نوع الكلاس.
  3. خلق Constructor  لأجل الكلاس من نوع Protected. 
  4. خلق method من صنف static من نوع عام public تقوم هذه العملية بأرجاع instance.
في الرسم التالي سوف نوضح الرسم الهيكلي للنمط بواسطة لغة UML 

 نلاحظ من الرسم وجود عضو instance_ وحيد يتم خلقه بواسطة العملية Instance الموجودة داخل الكلاس Singleton.

الكود : 

الأن سوف نقوم بكتابة الكود علما ان الكود مكتوب بلغة #C وبأستخدام بيئة Visual Studio 2010 ,وأن الكود مكتوب لأجل تعريف هيكلية النمط Singleton :

خلق هيكلية نمط Singleton :


الترقيم في الكود أعلاه يعكس مرحلة التنفيذ أعلاه .نلاحظ وجود الممر العالمي global point الذي يمكن رؤيته من جميع الكلاسات الموجودة ضمن التطبيق , ومن خلاله يتم خلق instance_ الوحيد وفي كل مرة يتم أستدعاء هذا الممر Instance يتم أرجاع instance_ الوحيد.

 تنفيذ النمط Singleton :

سوف يتم خلق كائنين من نوع كلاس Singleton وسوف نوضح الكود من خلال الشكل التالي الذي يوضح العملية الأجرائية لخلق الكائن s1 :

A - يتم خلق الكائن s1 وذلك بالذهاب مباشرةالى كلاس Singleton بحيث يذهب الى العملية Instance .
B - يتم التحقق من member المسمى instance_ هل هو يساوي null بمعنى غير مخلوق بالكامل او تم خلقه .
C - نعم يساوي null أذن يتم خلق instance_ بالكامل وتؤشيره الى كلاس Singleton .
D - يتم خلق Constructor  مباشرة .
E - وأخيرا يتم أرجاع الكائن مخلوق ومؤشر بالكامل الى s1.

العملية الأجرائية لخلق الكائن s2.

A - أيضا الذهاب الى Instance الموجودة داخل كلاس Singleton 
B - التأكد من الكائن instance_ هل محدد مسبقا ام يساوي null بمعنى غير محدد ومؤشر الى كلاس معين ,اذن النتيجة محدد مسبقا ولا يساوي null.
E - وبما أن الكائن instance_ مؤشر  يتم أرجاعه الى الكائن s2.

المخرجات :

أذن بعد تنفيذ الكود سوف يتم التأكد من الكائنين هل متساويين بمعنى يحملان نفس النوع ومؤشران الى نفس الكائن instance_ , وبالتأكيد سوف يكون الأخراج هو التشابه :

النتيجة :

  • خلق كائن وحيد على طول حياة التطبيق يوفر كفاءة ومساحة للذاكرة 
  • النمط جدا مفيد بالأتصال بقواعد البيانات بحيث يوفر ممر أتصال وحيد ومؤمن من الأختراق .
  • يستخدم بكثرة في Logger وذلك عندما تريد تسجيل معلومات في فايل معين ويكون التسجيل بخلق كائن وحيد ومن خلال ممر عالمي 

No comments:

Post a Comment