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

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

بریم که ساختار این الگو رو بشناسیم...


فرض کنید قرار بازی ای بسازید که تو این بازی از چیزی شبیه کرنومتر استفاده میکنید ( مثلا برای زمان گرفتن چیزی در بازی) ،‌ خب کلاس این کرنومتر رو میسازیم اما با الگوی Singleton ،‌ چرا ؟

کلاس از چند تا متد ساده برای شروع و توقف و نشان دادن زمان تشکیل میشه و خصوصیاتی یا ارث بردن ای وجود ندارد و چیزی که از همه مهتره ،‌ فقط باید یک کرنومتر در کل صفحات بازی فعال باشد :


اگر قرار بود در هر صفحه شی ای از کرنومتر ساخته شود ، اونوقت زمان به هم میخورد اما اینجا یک کرنومتر کلی برای همه جا داریم ، این یک مثال ساده برای درک singleton بود و اما تعریف دقیق این الگو :

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

فرم کلی الگو به این صورت است : (swift)


class Singleton {

    private init() { }

    static let instance = Singleton()

    var simpleVariable : [String] = []

}


تو این روش باید سازنده ی کلاس ، خصوصی باشد و کلاس یک نوع داده از خودش داشته باشه که ما فقط با اون کار میکنیم و البته این یعنی فقط یک نمونه از کلاس و اگر هرجای برنامه کد زیر رو بزنیم با خطا مواجه میشیم : (swift)

    let object = Singleton()

خب دلیلش هم واضح است ، سازنده ی کلاس خصوصیه و اجازه ساخت نمونه از آن را نداریم (singleton) .

حالا برای مثال بیایم کلاس کرنومتر(کلی) رو بسازیم تا بفهمیم چرا اینجا استفاده از این الگو به نظر خوب است :
(swift)



class Singleton {

    private init() { }

    static let instance = Singleton()

func start() {
//something happen here
}

func stop() {
//something happen here too
}
}

خب با اینکه در متد های start و stop چه اتفاقی رخ میده کاری نداریم . چیزی که مهمه هروقت هرکجا متد stop رو صدا کنیم میدونیم همه جا کرنومتر متوقف شده است.


ویژگی ها :

  • به صورت سراسری قابل دسترس است و فقط یک نمونه از کلاس وجود دارد.
  • در اولین مقدار دهی یا اولین صدا کردن ساخته میشود.
  • خیلی از برنامه نویس ها به این روش اشکال میگیرند و اون رو خلاف الگو (anti pattern ) میدانند ، به این معنی که روشی سرعتی و بدون بهره فقط برای حل کردن لحظه ای مشکل است.
  • بعضی وقت ها بخاطر محدودیت در ایجاد نمونه ، مشکل ساز میشود.
  • چون متد های آن اکثرا ترکیبی از چند تابع دیگر اند ، تست یا ویرایش آن بسیار سخت است.
  • قابل ارث بری نیست.

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


شاید الان بخواید این الگو رو به زبانی که به آن مسلط اید امتحان کنید !



لینک های مرتبط :

https://softwareengineering.stackexchange.com/questions/252/when-is-singleton-appropriate

softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what

http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons