JavaRush /وبلاگ جاوا /Random-FA /الگوها و Singleton - برای همه کسانی که برای اولین بار با ...

الگوها و Singleton - برای همه کسانی که برای اولین بار با آنها روبرو شدند

در گروه منتشر شد
این مقاله برای کسانی است که برای اولین بار با مفهوم الگوها مواجه شدند، در مورد Singleton'e شنیدند، یا به نوعی آن را ساختند، اما هنوز چیزی متوجه نشدند. خوش آمدی! دانش‌آموزان JavaRush برای اولین بار در سطح 15 با الگوها مواجه می‌شوند، زمانی که به طور غیرمنتظره کلاهک از شما می‌خواهد که یک الگو را Singletonبا یک پیاده‌سازی تنبل «اصلاح» و پیاده‌سازی کند. دانش آموزانی که برای اولین بار در مورد آن می شنوند Singletonبلافاصله یک سری سؤال دارند: یک الگو چیست، چرا به آن نیاز است، چه نوع الگوی است، Singletonو در نهایت، این چه نوع اجرای تنبلی است. بیایید به ترتیب پاسخ دادن را شروع کنیم: الگوها و سینگلتون - برای همه کسانی که برای اولین بار با آنها روبرو شدند - 1

به هر حال الگو چیست؟

برای درک بهتر، من فکر می کنم ارزش پاسخ دادن به این سوال از تاریخ را دارد. در میان برنامه نویسان، چهار نویسنده معروف وجود دارد: اریش گاما، ریچارد هلم، رالف جانسون و جان ولیسیدز، که ایده جالبی را ارائه کردند.
الگوها و Singleton - برای همه کسانی که برای اولین بار با آنها روبرو شدند - 2
آنها متوجه شدند که هنگام نوشتن برنامه ها اغلب مجبور بودند تقریباً همان مشکلات را حل کنند و کدهایی از یک نوع در ساختار بنویسند. بنابراین، آنها تصمیم گرفتند الگوهای معمولی را که اغلب در برنامه نویسی شی گرا استفاده می شوند، در قالب الگوها توصیف کنند. این کتاب در سال 1995 با عنوان «تکنیک های طراحی شی گرا» منتشر شد. الگوهای طراحی" . عنوان کتاب خیلی طولانی بود و به سادگی به عنوان کتاب گروه چهار شناخته شد . در چاپ اول، 23 الگو منتشر شد و پس از آن ده ها الگوی دیگر کشف شد. بنابراین، در پاسخ به سؤال این پاراگراف، "الگوها چیست؟" ، اجازه دهید تنها در چند کلمه خلاصه کنیم:
الگو یک راه حل استاندارد شده برای یک مشکل رایج است.
و Singletonاین فقط یکی از این الگوهاست.

چرا به الگوها نیاز داریم (الگوهای طراحی)

شما می‌توانید بدون دانستن الگوها برنامه‌نویسی کنید؛ می‌توانید این را به سادگی با درک این واقعیت تأیید کنید که تا سطح پانزدهم در JavaRush صدها برنامه کوچک نوشته‌اید بدون اینکه چیزی در مورد وجود آنها بدانید. این نشان می دهد که یک الگو نوعی ابزار است که وجود آن یک استاد را از یک آماتور متمایز می کند:
الگوها و Singleton - برای همه کسانی که برای اولین بار با آنها روبرو شدند - 3
الگوها چگونگی حل صحیح یکی از مسائل معمولی را توضیح می دهند. در نتیجه، دانستن الگوها در وقت شما صرفه جویی می کند. می توان با الگوریتم ها قیاس کرد. به عنوان مثال، می توانید الگوریتم مرتب سازی خود را با بلک جک و اعداد ایجاد کنید و زمان زیادی را صرف آن کنید یا می توانید از الگوریتمی که مدت ها پیش توضیح داده شده است استفاده کنید و آن را پیاده سازی کنید. در مورد الگوها هم همینطور است. بعلاوه، با استفاده از الگوها، کدها استانداردتر می شوند و در صورت استفاده از الگوهای مناسب، از آنجایی که قبلاً در این الگو پیش بینی و حذف شده بودند، احتمال اشتباه کمتری خواهید داشت. خوب، علاوه بر همه چیز، دانش الگوها به برنامه نویسان اجازه می دهد تا یکدیگر را بهتر درک کنند. فقط گفتن نام قالب کافی است، به جای اینکه سعی کنید به برنامه نویسان همکار خود توضیح دهید که می خواهید چه کاری انجام دهند. بنابراین، به طور خلاصه، الگوهای طراحی کمک می کند:
  • چرخ را دوباره اختراع نکنید، بلکه از راه حل های استاندارد استفاده کنید.
  • استاندارد کردن کد؛
  • استاندارد کردن اصطلاحات؛
در پایان این بخش، متذکر می شویم که کل تنوع الگوها را می توان به سه گروه بزرگ ساده کرد:
الگوها و سینگلتون - برای همه کسانی که برای اولین بار با آنها روبرو شدند - 4

در نهایت یک الگوی سینگلتون

Singletonبه الگوهای مولد اشاره دارد . ترجمه تحت اللفظی آن تنها است. این الگو تضمین می کند که یک کلاس فقط یک شی (یک نمونه از کلاس) دارد و یک نقطه دسترسی سراسری برای آن شی ارائه می شود. از توضیحات باید مشخص شود که این الگو باید در دو مورد استفاده شود:
  1. زمانی که نباید بیش از یک شی از هر کلاس در برنامه شما ایجاد شود. به عنوان مثال، در یک بازی کامپیوتری شما یک کلاس "شخصیت" دارید و این کلاس باید فقط یک شی داشته باشد که خود شخصیت را توصیف کند.

  2. هنگامی که شما نیاز به ارائه یک نقطه دسترسی جهانی به یک شی کلاس دارید. به عبارت دیگر، باید مطمئن شوید که شی از هر نقطه برنامه فراخوانی می شود. و افسوس که برای این کار تنها ایجاد یک متغیر سراسری کافی نیست، زیرا محافظت از نوشتن نیست و هر کسی می تواند مقدار این متغیر را تغییر دهد و نقطه دسترسی جهانی به شی از بین می رود. این ویژگی ها Singletonمورد نیاز هستند، برای مثال، زمانی که شما یک شی از یک کلاس دارید که با یک پایگاه داده کار می کند، و نیاز دارید که پایگاه داده از قسمت های مختلف برنامه قابل دسترسی باشد. و Singletonتضمین می کند که هیچ کد دیگری جایگزین نمونه قبلی کلاس ایجاد نشده باشد.
این دو مشکل با Singleton: باید یک شی در برنامه وجود داشته باشد و دسترسی جهانی به آن وجود داشته باشد. در مثال در سطح 15، cap می خواهد این الگو را برای کار زیر پیاده سازی کند (توضیحات آن در اینجا آمده است):
الگوها و Singleton - برای همه کسانی که برای اولین بار با آنها روبرو شدند - 5
پس از مطالعه دقیق شرایط، مشخص می شود که چرا دقیقاً Singleton(Single) در اینجا مورد نیاز است. پس از همه، برنامه از شما می خواهد که یک شی از هر کلاس ایجاد کنید: Sun, Moon, Earth. و منطقی است که فرض کنیم هر کلاس در برنامه نباید بیش از یک خورشید/ماه/زمین ایجاد کند، در غیر این صورت پوچ خواهد بود، مگر اینکه البته نسخه‌ای از جنگ ستارگان را بنویسید. ویژگی پیاده سازی Singletonجاوا در سه مرحله رفتار Singleton در جاوا را نمی توان با استفاده از یک سازنده معمولی پیاده سازی کرد زیرا سازنده همیشه یک شی جدید را برمی گرداند. بنابراین، تمام پیاده سازی های Singleton'a به مخفی کردن سازنده و ایجاد یک روش استاتیک عمومی می رسد که وجود یک شی واحد را کنترل می کند و تمام اشیاء تازه ظاهر شده را "از بین می برد". اگر Singleton'a فراخوانی شود، باید یا یک شی جدید ایجاد کند (اگر قبلاً در برنامه نیست) یا یکی را که قبلاً ایجاد شده است برگرداند. برای انجام این کار: شماره 1. – باید یک فیلد استاتیک خصوصی به کلاس حاوی یک شیء واحد اضافه کنید:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. - سازنده کلاس (سازنده پیش فرض) را خصوصی کنید (به طوری که دسترسی به آن در خارج از کلاس بسته شود، سپس نمی تواند اشیاء جدید را برگرداند):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . - یک روش ایجاد استاتیک را که برای به دست آوردن تک تون استفاده می شود، اعلام کنید:
public class LazyInitializedSingleton {
    private static LazyInitializedSingleton instance;
        private LazyInitializedSingleton(){}
        public static LazyInitializedSingleton getInstance(){ // #3
        if(instance == null){		//if the object has not been created yet
            instance = new LazyInitializedSingleton();	//create a new object
        }
        return instance;		// return the previously created object
    }
}
مثال بالا تا حدودی ناشیانه است، زیرا ما به سادگی سازنده را پنهان می کنیم و روش خود را به جای سازنده استاندارد ارائه می دهیم. از آنجایی که هدف این مقاله این است که دانش‌آموزان JavaRush برای اولین بار با این الگو (و به طور کلی الگوها) در تماس باشند، ویژگی‌های پیاده‌سازی Singleton‌های پیچیده‌تر در اینجا ارائه نخواهد شد. ما فقط توجه می کنیم که بسته به پیچیدگی برنامه، ممکن است به اصلاح دقیق تری از این الگو نیاز باشد. به عنوان مثال، در یک محیط چند رشته ای (به مبحث Threads مراجعه کنید)، چندین رشته مختلف می توانند به طور همزمان متد Singleton's getter را فراخوانی کنند، و کد توضیح داده شده در بالا کار نخواهد کرد، زیرا هر رشته منفرد می تواند چندین نمونه از کلاس ایجاد کند. فورا. بنابراین، هنوز چندین رویکرد مختلف برای ایجاد تک‌تنه‌های ایمن Thread وجود دارد. اما این داستان دیگری است =) و در نهایت. Lazy Initialization که درپوش درخواست کرد چیست ؟ این یک تکنیک برنامه نویسی است که در آن یک عملیات فشرده منابع (و ایجاد یک شی یک عملیات فشرده منابع است) بر اساس تقاضا انجام می شود، نه از قبل. چیزی که اساساً در کد ما اتفاق می افتد Singleton. به عبارت دیگر، شی ما در لحظه دسترسی به آن ایجاد می شود و نه از قبل. نباید تصور کرد که مفهوم اولیه سازی تنبل به نحوی با Singleton'om' مرتبط است. مقداردهی اولیه تنبل در سایر الگوهای طراحی تولیدی نیز استفاده می شود، به عنوان مثال در Proxy و Factory Method، اما این داستان دیگری است =) در تهیه مقاله از منابع زیر استفاده شده است:
  1. بهترین تمرینات الگوی طراحی جاوا Singleton با مثال
  2. الگوهای طراحی
  3. صحیح Singleton در جاوا
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION