راهنمای پیاده سازی الگوی طراحی Singleton

Design Pattern and Practices
خیلی وقت پیش، شاید حدود دو یا سه سال پیش برای اولین بار کلمه Singletone به چشمم خورد و متوجه شدم که چنین چیزی هم وجود دارد: اما بخاطر موارد استفادهای که داشتم تا همین چند وقت پیش فرصتی جهت مطالعه دقیق و درک آن پیدا نکرده بودم. اما حالا کهمتوجه داستان شدم، بهتر دانستم که آن را با شما قسمت کنم.
—————————————————————-
این مطلب زیر نظر مجوز GFDL منتشر میشود. و کلیه حقوق آن برای همگان آزاد است، بدین شرط که به کلیه شرایط موجود در مجوز GFDL ( که یک نسخه از متن انگلیسی مجوز GFDL در این محل و یک ترجمه غیر رسمی (فارسی) از متن مجوز GFDL که در مرداد ۱۳۸۳ توسط کاوه رنجبر تهیه شده است در این محل ) قرار دارد پایبند باشد.

GNU Logo
عنوان مطلب : راهنمای پیاده سازی الگوی طراحی Singletone
بخش ثانی : ندارد
تاریخ انتشار : 13/05/1388 مطابق با 04/08/2009
شماره نسخه : نسخه یک
نویسنده : ناصر حاجلو
ای-میل نویسنده : n.hajloo@gmail.com
Copyright (c) 2009 Nasser Hajloo.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”.
—————————————————————-
الگوی طراحی یا Design Pattern چیست ؟ شاید در یک جمله بتوان گفت که : برنامهنویسهایی که تجربیات زیادی در پیادهسازی مواردی خاص دارند، و در حل یک مسئله خاص به بهترین راهحل دست پیدا کردهاند، این تجربیات موفق را در قالب الگوی طراحی یا پیشنهادات به سایر برنامهنویسها اعلام میکنند.
Singletone یک الگوی طراحی است که برای حصول اطمینان از ایجاد فقط و تنها فقط یک نمونه (instance) از یک class خاص کاربرد پیدا میکند.
برای مثال وقتی که شما میخواهید به Database یک Connection بزنید و از آن Connection در برنامه استفاده کنید، لزومی ندارد که دائما این Connection را باز کنید و ببندید، سینگلتون به شما این اطمینان را میدهد که پس از ایجاد اولین نمونه از کلاسی که حاوی Connection است، هیچ نمونه دیگری از آن ایجاد نشود.
یکی از مزایای Singletone این است که علاوه بر اینکه فقط و تنها فقط یک نمونه از آن ایجاد میشود، بدون اینکه نیازی باشد میتوان از کلاس بدون اینکه از آن کلاس New کنید، استفاده کنید. و به همین خاطر شما میتوانید در هر کلاسی که مایلید از قابلیتهای کلاس سینگلتونتان استفاده کنید. در زیر با ذگر یک نمونه، توضیحات لازم را میآورم.
همانطور که گفته شد، شا نمیتوانید از کلاس سینگلتون New کنید. به همین خاطر Constructor کلاس سینگلتون شما باید Private باشد.
class Logger
{
StreamWriter sw;
private Logger()
{
sw = new StreamWriter(“Log.txt”);
}
}
همانطور که در بالا ملاحظه میکنید کلاس Logger که برای Log کردن استفاده میشود، دارای یک StreamWriter است که در Constructor کلاس که Privte است و نمیتواند از بیرون New بشود، new شده است. سالی که پیش میآید این است که اگر این کلاس از بیرون نمیتواند new بشود پس چرا آبجکت sw در داخل Constructor کلاس new شد است؟ پاسخ این است که این کلاس (loggr) خودش، خودش را در اولین مرتبه ای که از بیرون صدا زده شود new میکند ( به قطعه کد زیر دقت کنید ) همچنین توجه داشته باشید که با توجه به کد زیر این کلاس میتواند در بینهایت کلاس دیگر صدا زده شود و استفاده شود. اما در روند کار کاربر با برنامه، در اولین مرتبهای که نیاز باشد که از این کلاس استفاده شود، یک نمونه از این کلاس ایجاد میشود و تا آخرین لحظهای که برنامه در حال اجرا است، این آبجکت در حافظه قرار دارد. ( مگر آنکه شما متدی را برای خارج کردن آن از حافظه پیادهسازی کنید. )
public static Logger Instance
{
get
{
private static Logger instance = new Logger();
return instance;
}
}
در کد بالا توجه داشته باشید که بخاطر static بودن instance، این آبجکت همیشه قابل استفاده است. و در روال اجرای برنامه هر کجا که اولین مرتبه نیاز باشد قسمت get یک آبجکت از کلاس میسازد و در اختیار میگذارد.
حالا شما میتوانید با آبجکتی که در اختیار دارید هر کاری بکنید. برای نمونه یک متد برای Log کردن ناطلاعات را در زیر آوردهام. توجه داشته باشید که ان نمونه صرفا برای آشنایی آوده شده و کاربردی نیست ( گرچه بخوبی کار میکند )
public void Write(string s)
{
sw.WriteLine(s);
sw.Flush();
}
public void Close()
{
sw.Close();
}
تا اینجا هر چیزی که لازم بود را در رابطه با Singletone آموختید. نکته دیگری که در رابطه با Singletone وجود دارد این است که این پیادهسازی مناسب هر جایی نیست و وقتی که ما سربار زیادی دارید شما را با مشکل اساسی روبرو خواهد کرد. به همین دلیل در بیشتر موارد این الگوی راحی را با یک الگوی طراحی دیگر به نام Lazy ترکیب و استفاده میکنند. در مطلب آیده، به ترکیب الگوی طراحی سینگلتون با الگوی طراحی Lazy خواهم پرداخت.
منابعی برای مطالعه
معرفی الگوی طراحی در ویکی پدیا
دسته بندی بر اساس سالهای معرفی الگوی طراحی این الگوهای طراحی، بر اساس موارد دیگری مانند متودولوژی و معماری برنامه و … هم در همین صفحه قابل مشاهده است.

واقعا ممنون از مطلبت
یه سری به ما هم بزن http://www.mypsp.ir/index.html
مای پی اس پی
سلام
بابت مطالب خوبی که مینویسید از شما تشکر میکنم.
فقط غلط های املایی متن هست که خواننده را اذیت میکنه. من دیدم دوستان دیگه هم اشاره کرده بودند. اگر مایل باشید در ویرایش متن میتونم کمک کنم.
موفق باشید