امین احسان
امین احسان
خواندن ۳ دقیقه·۲ سال پیش

الگوی طراحی سینگلتون - Singleton Design Pattern

Singleton Design Pattern
Singleton Design Pattern


بررسی

الگوی طراحی Singleton به شما امکان می‌دهد اطمینان حاصل کنید که یک کلاس فقط یک نمونه دارد، در حالی که یک اشاره‌گر سراسری برای دسترسی به این نمونه ارائه می‌کند.


مشکل

این الگوی طراحی با نقض Single Responsibility Principle چند مشکل را همزمان حل می‌کند:

  • اطمینان حاصل می‌کند که یک کلاس فقط یک نمونه از خود دارد، (رایج‌ترین دلیل این امر کنترل دسترسی به برخی از منابع مشترک است) مانند: پایگاه داده یا یک فایل
  • نحوه کار به این صورت است. تصور کنید که یک شی ایجاد کرده‌اید اما پس از مدتی تصمیم به ایجاد یک شی جدید دارید، به جای دریافت یک شی تازه، نمونه‌ای را که قبلاً ایجاد کرده‌اید دریافت می‌کنید. توجه داشته باشید که اجرای این رفتار با یک Constructor معمولی غیرممکن است، چرا که بر اساس طراحی باید یک شی جدید را برگرداند.
  • بنابراین یک نقطه دسترسی سراسری به آن نمونه یکتا وجود خواهد داشت. (اما متغیرهای سراسری در حالی که بسیار مفیدند، ناامن هم هستند) زیرا هر بخش از کد که در روند اجرای برنامه حضور دارد، می‌تواند محتوای آن متغیرها را بازنویسی و برنامه را خراب کند. الگوی Singleton به شما امکان می‌دهد از هر کجای برنامه به برخی از نمونه‌ها دسترسی داشته باشید، با این حال آن نمونه‌ها را از بازنویسی شدن توسط کدهای دیگر نیز محافظت می‌کند.

این مشکل جنبه دیگری هم دارد. شما نمی‌خواهید کدی که مشکل را حل می‌کند در سراسر برنامه پخش شود، بنابراین بهتر است که آن را در یک کلاس قرار دهید. مخصوصا اگر بقیه کد شما از قبل به آن وابستگی داشته باشد.


راه حل

متد Constructor پیش فرض را Private کنید تا دیگر اشیا از عملگر New استفاده نکنند. یک متد Static ایجاد کنید که به عنوان سازنده عمل کند. این متد از Constructor که Private شده برای ایجاد یک شی استفاده کرده و آن را در یک فیلد Static ذخیره می‌کند.

همه فراخوانی‌های بعدی به این متد، شی ذخیره شده را برمی‌گرداند. بنابراین اگر کد شما به کلاس Singleton دسترسی دارد، می‌تواند متد سازنده جدید را فراخوانی کند. و هر زمان آن متد فراخوانی شود همان شی ذخیره شد در فیلد Static برگردانده خواهد شد.


ساختار

  • کلاس Singleton متد getInstance را به شکل static تعریف می‌کند که همان نمونه ساخته شده از کلاس خود را برمی‌گرداند. Constructor در Singleton باید از کد کلاینت پنهان باشد، فراخوانی متد getInstance باید تنها راه دریافت شی از کلاس Singleton بشود.


نمونه

دولت نمونه‌ای از الگوی Singleton است. یک کشور می‌تواند تنها یک دولت رسمی داشته باشد صرف نظر از هویت شخصی افراد تشکیل دهنده آن، عنوان دولت یک اشاره‌گر سراسری است که گروه افراد مسئول را، مشخص می‌کند.


نتیجه

از الگوی Singleton زمانی استفاده می‌شود که یک کلاس در برنامه شما فقط باید دارای یک نمونه واحد قابل دسترس برای تمام کدها باشد. مانند یک شی واحد از پایگاه داده که توسط بخش‌های مختلف برنامه به اشتراک گذاشته شده است.

این الگوی تمام ابزارهای دیگر برای ایجاد اشیا از یک کلاس را غیرفعال می‌کند، به جز روشی خاص، که یا یک شی جدید ایجاد می‌کند یا اگر قبلا ایجاد شده باشد، آن را بر می‌گرداند.

زمانی که به کنترل دقیق تری بر روی متغیرهای سراسری نیاز دارید از الگوی Singleton استفاده کنید.

الگوی Singleton تضمین می‌کند که، فقط یک نمونه از یک کلاس وجود دارد هیچ چیز به جز خود کلاس Singleton نمی‌تواند جایگزین نمونه ذخیره شده شود.

توجه داشته باشید که همیشه می‌توانید این محدودیت را تنظیم کنید و اجازه ایجاد هر تعداد نمونه از Singleton را بدهید. تنها کدی که نیاز به تغییر دارد، بدنه متد نمونه‌گیر است.


linkedin.com/in/AminEhsan

github.com/AminEhsan

مهندسی نرم افزاربرنامه نویسیالگوی طراحیdesign patternsingleton
مجموعه مقالات با هدف تحلیل و بررسی علوم کامپیوتر
شاید از این پست‌ها خوشتان بیاید