الگوی طراحی Singleton یک الگوی طراحی آفرینشی(Creational) است که به شما این امکان را میدهد که اطمینان حاصل کنید یک کلاس تنها یک نمونه دارد، در حالی که یک نقطه دسترسی عمومی به این نمونه وجود دارد. یعنی اگر در برنامه بیش از یک نمونه از این کلاس Object بسازید، تمامی آنها یک Object واحد هستند.
[divider]
مشکل
الگوی طراحی Singleton دو مشکل را همزمان حل می کند و اصل مسئولیت منفرد(Single Responsibility) را زیر پا می گذارد:
- اطمینان از این که کلاس مورد نظر فقط یک نمونه دارد. چرا کسی می خواهد کنترل کند که تعداد کلاس ها چقدر است؟ متداول ترین دلیل این امر کنترل دسترسی به منابع مشترک است – برای مثال ، بانک اطلاعاتی یا فایل.
در اینجا نحوه عملکرد این الگو آمده است: تصور کنید که شما یک Object را ایجاد کرده اید ، بعد از مدتی تصمیم به ایجاد یک مورد جدید گرفتید. به جای دریافت یک Object تازه ، همانی را که قبلاً ایجاد کرده اید دریافت خواهید کرد. بهتر است بدانید که استفاده معمول از Constructor امکان پیادهسازی چنین رفتاری را به ما نمیدهد. چرا که Constructor همیشه باید یک نمونه کاملا جدید از کلاس بسازد. در نتیجه اولین قدم در الگوی طراحی Singleton محدود کردن دسترسی به Constructor کلاس مورد نظر است.
- یک نقطه دسترسی عمومی به آن نمونه یکتا وجود دارد. متغیرهای سراسری را به یاد دارید؟ همان متغیرهایی که شما (خوب شما نه ، من) برای ذخیره برخی از اطلاعات اساسی استفاده میکنید، در حالی که بسیار مفیدند، همچنین بسیار نا امن هستند زیرا هر بخش کد که در روند اجرای برنامه حضور دارد، می تواند محتوای آن متغیرها را بازنویسی کند و برنامه را خراب کند.
دقیقاً مانند یک متغیر سراسری ، الگوی طراحی Singleton به شما این امکان را می دهد که از هر نقطه برنامه، به یک Object واحد دسترسی داشته باشید! با این حال، این الگو میتواند از آن Object مشترک در برابر تغییر توسط کدی دیگر محافظت کند.
یک جنبه دیگر برای این مشکل وجود دارد: شما نمی خواهید کدی که مشکل شماره ۱ را حل می کند در سراسر برنامه شما پخش شود. خیلی بهتر است که آن را در یک کلاس قرار دهید، به خصوص اگر بقیه کد شما قبلاً به آن بستگی داشته باشد.
امروزه الگوی طراحی Singleton به حدی رایج شده است که حتی اگر تنها یکی از مشکلات ذکر شده را برطرف کند، برنامهنویسان ترجیح میدهد از آن استفاده کنند.
[divider]
راهحل
تمام پیاده سازی های الگوی طراحی Singleton دارای این دو مرحله مشترک هستند:
- سازنده(Constructor) پیش فرض کلاس را private کنید تا به کمک عملگر new نتوان نمونه جدید از کلاس ایجاد کرد.
- یک متد استاتیک ایجاد کنید که به عنوان سازنده عمل کند. در پشت پرده، این متد از سازنده خصوصی کلاس برای ایجاد یک شی استفاده می کند و آن را در یک متغیر ایستا از جنس کلاس، ذخیره می کند. در نتیجه کلیه فراخوانیهای بعدی این متد، شی کش شده(cached) را برمی گرداند.
اگر کد شما به کلاس Singleton دسترسی داشته باشد، می توانید با متد استاتیک Singleton ارتباط بگیرید. بنابراین هر وقت آن متد فراخوانی می شود، همیشه همان شیء تکراری بازگردانده می شود.
[divider]
مثالی از الگوی طراحی Singleton دردنیای واقعی
دولت نمونه ای عالی از الگوی Singleton است. یک کشور می تواند فقط یک دولت رسمی داشته باشد. صرف نظر از هویت شخصی افرادی که دولت را تشکیل می دهند ، عنوان “دولت X” ، یک نقطه دسترسی عمومی است که گروه افراد مسئول را مشخص می کند.
[divider]
ساختار
به دیاگرام زیر دقت کنید. این دیاگرام، نحوهی پیادهسازی الگوی singleton را نمایش میدهد:
همانطور که در دیاگرام بالا قابل مشاهده است، کلاس Singleton متد استاتیک getInstance را تعریف می کند که نمونه همان کلاس خود را برمی گرداند. همچنین سازنده Singleton باید از کد client مخفی شود. فراخوانی متد getInstance باید تنها راه دریافت شی Singleton باشد.
در این آموزش سعی کردیم تا مفهوم الگوی طراحی Singleton را بیان کنیم و بدانیم که این الگو چه چالشی را برطرف خواهد کرد. برای پیادهسازی عملی این الگو، بسته به زبان برنامهنویسی مورد نظر، نمونه کدهایی وجود دارد که اکنون قادر به درک آنها هستید.
همچنین برای آشنایی با مفاهیم دیگر الگوهای طراحی، به دسته الگوهای طراحی نرمافزار مراجعه کنید.
موفق و پیروز باشید…