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

Design Pattern and Practices

Design Pattern and Practices

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

—————————————————————-

این مطلب زیر نظر مجوز GFDL منتشر می‌شود. و کلیه حقوق آن برای همگان آزاد است، بدین شرط که به کلیه شرایط موجود در مجوز GFDL ( که یک نسخه از متن انگلیسی مجوز GFDL در این محل و یک ترجمه غیر رسمی (فارسی) از متن مجوز GFDL که در مرداد ۱۳۸۳ توسط کاوه رنجبر تهیه شده است در این محل ) قرار دارد پایبند باشد.

GNU Logo

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 خواهم پرداخت.

منابعی برای مطالعه

معرفی الگوی طراحی در ویکی پدیا

دسته بندی بر اساس سال‌های معرفی الگوی طراحی  این الگوهای طراحی، بر اساس موارد دیگری مانند متودولوژی و معماری برنامه و … هم در همین صفحه قابل مشاهده است.

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

  1. masoud says:

    واقعا ممنون از مطلبت

    یه سری به ما هم بزن http://www.mypsp.ir/index.html

    مای پی اس پی

  2. مهدی says:

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: