سینگلتون
هـــدف
مـسئـــلـه
الگوی تکنهاد همزمان دو مشکل را حل میکند که با اصل مسئولیت واحد مغایرت دارد:
۱- تضمین میکند که یک کلاس تنها یک نمونه دارد. چرا کسی میخواهد تعداد نمونههای یک کلاس را کنترل کند؟ رایجترین دلیل برای این کار کنترل دسترسی به برخی منابع مشترک مانند پایگاه داده یا فایل است.
به این صورت عمل میکند: تصور کنید که یک شیء ایجاد کردهاید، اما پس از مدتی تصمیم گرفتید یک شیء جدید ایجاد کنید. به جای دریافت یک شیء جدید، شیای را که قبلاً ایجاد کردهاید دریافت خواهید کرد.
توجه داشته باشید که این رفتار با استفاده از یک سازنده معمولی قابل پیادهسازی نیست زیرا فراخوانی یک سازنده همیشه باید طبق طراحی یک شیء جدید را بازگرداند.
مشتریان حتی ممکن است متوجه نشوند که همیشه با یک شی کار می کنند.
۲- یک نقطه دسترسی جهانی به آن نمونه ارائه دهید. متغیرهای جهانی را به خاطر دارید که شما (خوب، من) برای ذخیره برخی اشیاء ضروری استفاده میکردید؟ در حالی که آنها بسیار مفید هستند، اما بسیار ناامن نیز هستند زیرا هر کدی میتواند به طور بالقوه محتویات آن متغیرها را بازنویسی کند و برنامه را خراب کند.
مانند یک متغیر جهانی، الگوی تکنهاد به شما اجازه میدهد از هر جایی در برنامه به یک شی دسترسی داشته باشید. با این حال، همچنین از آن نمونه در برابر بازنویسی توسط کدهای دیگر محافظت میکند.
جنبه دیگری از این مشکل وجود دارد: نمیخواهید کدی که مشکل شماره ۱ را حل میکند در سراسر برنامه شما پخش شود. بهتر است آن را در یک کلاس داشته باشید، به خصوص اگر بقیه کد شما از قبل به آن وابسته است.
امروزه، الگوی تکنهاد آنقدر محبوب شده است که مردم ممکن است چیزی را تکنهاد بنامند حتی اگر فقط یکی از مشکلات ذکر شده را حل کند.
راهــکــــار
همه پیادهسازیهای تکنهاد این دو مرحله مشترک را دارند:
- سازنده پیشفرض را خصوصی کنید تا از استفاده سایر اشیاء از عملگر
new
با کلاس تکنهاد جلوگیری کنید. - یک متد ایجاد استاتیک ایجاد کنید که به عنوان یک سازنده عمل میکند. در زیر کاپوت، این متد سازنده خصوصی را برای ایجاد یک شی فراخوانی میکند و آن را در یک فیلد استاتیک ذخیره میکند. تمام فراخوانیهای بعدی به این متد شی کش شده را بازمیگرداند.
- اگر کد شما به کلاس تکنهاد دسترسی دارد، میتواند متد استاتیک تکنهاد را فراخوانی کند. بنابراین هر زمان که این متد فراخوانی میشود، همیشه همان شی بازگردانده میشود.
مقایسه با دنیای واقعی
دولت یک مثال عالی از الگوی تکنهاد است. یک کشور فقط میتواند یک دولت رسمی داشته باشد. صرف نظر از هویت شخصی افرادی که دولت را تشکیل میدهند، عنوان “دولت X” یک نقطه دسترسی جهانی است که گروه افراد مسئول را شناسایی میکند.
ســاخــتـــار
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.