اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
در برخی از مواقع، ایجاد یک وهله از یک کلاس کاری هزینه بر میباشد. بنابراین نیاز است تا فقط یک وهله از آن کلاس را ایجاد و تا آخر اجرای برنامه از آن استفاده کرد. این راه حل در قالب یک الگوی طراحی به نام Singleton معرفی شده است. حال میخواهیم با استفاده از امکانات جنریک، کلاسی را طراحی کنیم تا عملیات ساخت وهلهها را انجام دهد.
برای ایجاد حالت Tread-Safe در برنامه هایی که امکان دسترسی همزمان به یک شیء (مثلا در برنامههای وب) وجود دارد، از یک بلاک Lock استفاده شده است تا در هر لحظه فقی یک نخ قادر به ایجاد Singleton شود.
در خط اول، با تعریف یک متغیر و قرار دادن وهله استاتیک که بوسیله پروپرتی استاتیک SingletoneInstance برگشت داده میشود، یک شی Singleton از کلاس FirstSingleton را ایجاد میکنیم.
نکاتی که در طراحی یک الگوی Singleton باید مد نظر داشت این است که:
- دسترسی سازنده کلاس Singleton را از نوع Private تعیین کنیم.
- یک فیلد استاتیک از نوع کلاس Singleton تعریف کنیم.
- یک خاصیت از نوع استاتیک فقط خواندنی (یعنی فقط get داشته باشد) تعریف کرده تا فیلد استاتیک را مقداردهی و Return کند. به جای پروپرتی میتوان از یک متد استاتیک نیز استفاده کرد.
public class SingletonClassCreator<T> where T:class , new() { private static T _singletoneInstance; private static readonly object Lock = new object(); public static T SingletoneInstance { get { lock (Lock) { if (_singletoneInstance == null) { _singletoneInstance = new T(); } } return _singletoneInstance; } } private SingletonClassCreator() { } }
حال برای ایجاد وهلههای Singleton از کلاسهای مورد نظر به صورت زیر عمل میکنیم
public class FirstSingleton { public int Square(int input) { return input*input; } }
static void Main(string[] args) { var firstSingletone = SingletonClassCreator<FirstSingleton>.SingletoneInstance ; Console.WriteLine(firstSingletone.Square(12)); Console.ReadKey(); }