Singleton Pattern

آموزش دیزاین پترن الگوی طراحی design patterns pattern singleton سینگلتون یگانه منحصر به فرد در اندروید آموزش دیزاین پترن اندروید جاوا رایگان دانلود ویدیو

سطح آموزش: #متوسط

قبلا راجع به دیزاین پترن صحبت کردیم و فهمیدیم به ما کمک میکنن تا مسائل برنامه‌نویسی رو بهینه‌تر حل کنیم.

پترن سینگلتون (Singleton Pattern)

یکی از ساده‌ترین الگو‌هایی که استفاده میکنیم singleton هست. singleton رو احتمالا بشه “یگانه” یا “منحصر به فرد” ترجمه کرد ولی من ترجیح میدم از خود لغت singleton استفاده کنم.

کاربرد

بعضی وقت‌ها نیاز داریم که تنها یک نمونه (instance) از یک کلاس داشته باشیم. مثلا توی آموزش ویدیویی رتروفیت خواهید دید که برای کل اپلیکیشن ما احتیاج به یک کلاینت منحصر به فرد برای ارتباط با اینترنت داریم. یا مثلا داخل یک بازی یا اپلیکیشن کلاس اطلاعات کاربر ممکنه یک کلاس منحصر به فرد باشه که نیاز داشته باشیم از تمام اپلیکیشن به اون دسترسی داشته باشیم. در این موارد ما از سینگلتون استفاده میکنیم.

کارکرد

مطمئن میشه تنها یک نمونه از کلاس مورد نظر ما ساخته شده.

دسترسی جامع از همه جای اپلیکیشن (global access) به نمونه مورد نظر میده.

پیاده‌سازی

برای پیاده‌سازی این پترن بایستی یک نمونه private و static از کلاس بسازید (constructor هم باید private و static باشد) و اون رو با استفاده از متدی public و static در هرجایی از پروژه که نیاز داشتید فراخونی کنید.

برای مثال به این تکه کد (+منبع) دقت کنید:

همون طور که می‌بینید نمونه و کانستراکتور هر دو دسترسی private دارن و تنها از طریق متد getInstance میشه به نمونه دسترسی داشت.

توجه کنید که getInstance در صورتی که نمونه ساخته نشده باشه (مثلا در ابتدای اجرای برنامه) با استفاده از constructor یک نمونه میسازه و در باقی موارد تنها نمونه ساخته شده رو return می‌کنه.

نکته بعدی متد doSomething هست. توجه کنید متدها نباید static باشن و برای فراخونی میتونید به طریق زیر عمل کنید:

نمونه موارد استفاده

یک نمونه که بالاتر هم اشاره کردم کلاس کلاینت رتروفیت در آموزش ویدیویی مربوطه بود. برای ارتباط اپلیکیشن با سرور ما نیاز به تعریف یک کلاینت داریم. و بهترین روش برای داشتن یک کلاینت واحد در سراسر اپلیکیشن با دسترسی public پترن singleton هست. تکه کد زیر استفاده از این پترن رو نشون میده:

 

یکی دیگه از جاهای پرکاربرد که میتونید از singleton استفاده کنید، ساخت یک نمونه sharedPrefrence و استفاده در سراسر اپلیکیشن هست.

نقاط حساس

مالتی تردینگ (چند نخی): وقتی برنامه‌تون multithreaded هست باید بیشتر مراقب استفاده از سینگلتون باشید. نباید تو ترد همزمان اطلاعات مربوط به یک instance رو تغییر بدن و در صورتی که نیاز به این کار هست باید حواستون باشه این تغییرات سنکرون اتفاق بیفته تا خطایی در مقدار خوانده یا نوشته شده در یک ترد پیش نیاد. 

Serialization: هنگامی که از سریلایزیشن در یک کلاس سینگلتون استفاده میکنید باید حواستون باشه موقع serialized و deserialized کردن object نمونه اضافی تولید نشه. برای اینکار میتونید متد readResolve رو به شکل زیر پیاده‌سازی کنید:

دسترسی global بر اساس نام کلاس: از اونجایی در سینگلتون ما براساس نام کلاس به نمونه دسترسی داریم اگر در آینده نیاز بشه کلاس رو جایگزین کنیم باید تمام رفرنس‌ها به کلاس قبلی رو جایگزین کنیم. البته این مسئله با توجه به ابزارهای قدرتمند Android Studio هرگز تو برنامه‌نویسی اندروید مسئله ساز نمیشه.

7 دیدگاه برای “Singleton Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *