بحث هذه المدونة الإلكترونية

الأحد، 27 يونيو 2010

Singleton Pattern

Singleton Pattern

الغرض من هذا النوذج هو التاكد من عدم عمل اكثر من نسخة من نفس الكلاس والتاكد ايضا من نقطة دخول رئيسية وعامة للاوبجيكت والمثال الاوضح لذلك هي ايقونة عمل البرامج حيث ان بعض البرامج لا تسمح بتشغيل اكثر من نسخة في ان واحد .
مثال:
public sealed class Singleton
{
    // Private Constructor
    Singleton() { }

    // Private object instantiated with private constructor
    static readonly Singleton instance = new Singleton();

    // Public static property to get the object
    public static Singleton UniqueInstance
    {
        get { return instance; }
    }
}


الكلمة المحجوزة sealed تسمح للكلاس بعمل نسخة واحدة من الكلاس وبذلك لن نحتاج الى طريقة معقدة للتعامل مع هذا الباترن
لاحظ ان المنشئ او الـ constructor  برايفت وذلك ليتم انشاء الاوبجيكت فقط من خلال ال UniqueInstance وبذلك نضمن وجود اوبجيكت واحد تم انشاءه ولكن في هذه الحالة اذا اردنا ان نقوم بعمل نسخة اخرى لاستخدامها في thread اخر لن نستطيع واذا حاولنا استخدام نفس النسخة في اكثر من thread  سوف يكون unsafe-thread
ولذلك نعالج هذه المشكلة في الكود التالي
public class Singleton
{
    // Private constructor
    Singleton() { }

    // Nested class for lazy instantiation
    class SingletonCreator
    {
        static SingletonCreator() { }
        // Private object instantiated with private constructor
        internal static readonly
         Singleton uniqueInstance = new Singleton();
    }

    // Public static property to get the object
    public static Singleton UniqueInstance
    {
        get { return SingletonCreator.uniqueInstance; }
    }
}

كما ترى لم نقم باستخدام sealed وفي نفس الوقت ضمنا عدم تكرار انشاء الاوبجيكت وذلك لان الدالة UniqueInstance سوف تمرر في كل مرة نفس الاوبجيكت 

هناك 3 تعليقات:

  1. الله ينور شكرا ليك جدا جدا جدا
    omar.netdeveloper@yahoo.com
    اتمنى لو في فيديو عربي للشرك كل ال design pattern

    ردحذف
  2. اتمنى مراسلتي

    ردحذف
  3. شكرا جزيلاً ياباشمهندس.
    عايز أكلمك ومش عارف اوصل للميل بتاعك
    ممكن تبعتلي على الميل علشان أتواصل معاك ؟
    ايميلي
    ayman.sharkawy609@gmail.com

    ردحذف