نام الگوی طراحی | Singleton |
دسته بندی | creational design patterns |
تعریف الگوی Singleton
یکی از ساده ترین الگوی های طراحی Singleton می باشد. یک کلاس زمانی Singleton است که بیش از یک شی از روی آن نتوان ساخت. در واقع این کلاس فقط یکبار نمونه سازی می شود و پس از آن از همان نمونه ساخته شده استفاده می کنیم.
به این نکته توجه کنید که کلاس دارای الگوی Singleton یک کلاس استاتیک نیست بلکه یک کلاس معمولی است که می تواند یک Interface را پیاده سازی کرده و یا از یک کلاس دیگر مشتق شود.
یکی از کلاسهایی که در طول برنامه شما زیاد از آن استفاده می کنید کلاس Logger است برای ثبت همه رویدادهایی که در سیستم اتفاق می افتد ما به دفعات زیاد در طول برنامه توابع آن را Call خواهیم کرد.
یا گاهی برای برخی اطلاعات پایه در برنامه ما وجود دارند که در طول اجرای برنامه زیاد از آنها استفاده می کنیم و برای هر بار استفاده آنها را از دیتابیس Fetch می کنیم. با استفاده از الگوی Singleton می توان این اطلاعات پایه را یکبار دریافت کرده و از آن در طول برنامه استفاده کرد.
نحوه پیاده سازی الگوی Singleton
- سازنده (constructor) کلاس را Private می کنیم تا امکان نمونه سازی از کلاس بصورت new کردن امکان پذیر نباشد.
1private MySingletonCls () {} - یک متغیر private و استاتیک از جنس همان کلاسی که در آن هستیم تعریف می کنیم و در واقع این متغیر تنها نسخه از کلاس را در خود نگهداری می کند.
1private static MySingletonCls instance; - یک متد نیاز است تا تضمین کننده تولید یک نسخه از کلاس باشد این متد باید استاتیک و public باشد از از طریق کلاس های دیگر قابل دستیابی باشد.
123456789public static MySingletonCls GetInstance{get{if(instance == null){instance = new MySingletonCls();}return instance;}}
عملکرد این بخش که مهمترین بخش یک کلاس Singleton می باشد بسیار مهم است و باید به درستی درک شود. زمانی که GetInstance برای اولین بار Call می شود متغیر instance مقدار null دارد بنابراین شرط درون if درست بوده و متغیر instance ساخته خواهد شد. ولی زمانی که برای دفعات بعدی GetInstance صدا می شود، چون متغیر instance دیگر null نیست شرط درون if اجرا نشده و همان متغیر instance که دفعه اول ساخته شده است برگشت داده می شود.یک نسخه ساده از یک کلاس Singleton اینگونه خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class MySingletonCls { private static MySingletonCls instance; private MySingletonCls() {} public static MySingletonCls Instance { get{ if(instance == null){ instance = new MySingletonCls(); } return instance; } } } |
و در زبان C++ اینگونه خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Logger { private: static Logger* instance; Logger(){}; public: static Logger* getInstance() { if (instance == NULL) { instance = new Logger(); } return instance; } }; Logger* Logger::instance = NULL; |
و یک کلاس Singleton در پایتون اینگونه خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Singleton(type): def _init_(cls, name, bases, attrs, **kwargs): super()._init_(name, bases, attrs) cls._instance = None def _call_(cls, *args, **kwargs): if cls._instance is None: cls.instance = super().call_(*args, **kwargs) return cls._instance class Logger(metaclass=Singleton): #some class pass |
مطلب مفیدی بود امیدوارم ادامه دار باشه