CodeGym /وبلاگ جاوا /Random-FA /الگوها و Singleton در جاوا
John Squirrels
مرحله
San Francisco

الگوها و Singleton در جاوا

در گروه منتشر شد
این مقاله برای کسانی است که برای اولین بار با مفهوم الگوهای طراحی مواجه می شوند، اصطلاح تک تن را شنیده اند یا به نوعی الگوی تک تن را اجرا کرده اند اما متوجه نشده اند که چه اتفاقی در حال رخ دادن است. خوش آمدی! دانش آموزان CodeGym برای اولین بار در سطح 15 با الگوهای طراحی مواجه می شوند، زمانی که کاپیتان به طور غیرمنتظره از آنها می خواهد که درک خود را با اجرای الگوی جاوا سینگلتون با اجرای تنبل "تقویت" کنند. دانش آموزانی که برای اولین بار در مورد الگوی تکی می شنوند بلافاصله سؤالات زیادی دارند: الگوی طراحی در دنیا چیست؟ چرا ما به اون احتیاج داریم؟ تک قلو چیست ؟ و در نهایت اجرای تنبلی چیست؟ بیایید به ترتیب به این سوالات پاسخ دهیم.

الگوی طراحی در دنیا چیست؟

من معتقدم کمی تاریخ برای پاسخ به این سوال با بهترین درک است. چهار نویسنده معروف برنامه نویسی (اریش گاما، جان ولیسیدز، رالف جانسون و ریچارد هلم) هستند که ایده جالبی را ارائه کردند. آنها متوجه شدند که توسعه نرم افزار اغلب آنها را ملزم می کند که تقریباً همان مشکلات را حل کنند و کدهایی را با ساختار مشابه بنویسند. بنابراین آنها تصمیم گرفتند الگوهای معمولی را توصیف کنند که اغلب باید در برنامه نویسی شی گرا مورد استفاده قرار گیرند. کتاب آنها در سال 1994 با عنوان Design Patterns: Elements of Reusable Object-Oriented Software منتشر شد. معلوم شد که نام کتاب خیلی طولانی است و مردم به سادگی آن را کتاب گروه چهار نفر می نامند. نسخه اول شامل 23 الگو بود. پس از آن، ده ها الگوی دیگر کشف شد. پس اجازه دهید پاسخ سوال این بند (الگوهای طراحی در دنیا چیست؟) را در چند کلمه خلاصه کنیم:
الگوی طراحی یک راه حل استاندارد شده برای یک مشکل رایج است.
و الگوی تک تن فقط یکی از آنهاست.

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

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

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

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

  2. زمانی که باید نقطه ای برای دسترسی سراسری به یک شی فراهم کنید. به عبارت دیگر، شما باید شی را از هر جایی در برنامه در دسترس قرار دهید. افسوس، ایجاد یک متغیر سراسری به سادگی کافی نیست، زیرا محافظت از نوشتن ندارد: هر کسی می‌تواند مقدار متغیر را تغییر دهد، بنابراین ممکن است نقطه دسترسی جهانی شیء از بین برود. این ویژگی های یک Singleton ضروری است، برای مثال زمانی که شما یک شی دارید که با یک پایگاه داده کار می کند و باید از قسمت های مختلف برنامه به پایگاه داده دسترسی داشته باشید. یک Singleton تضمین می کند که هیچ کس کدی را که جایگزین نمونه ایجاد شده قبلی شود، ننویسد.
بنابراین یک Singleton این دو نیاز را برآورده کرد: باید فقط یکی از نوع خاصی از شی در برنامه وجود داشته باشد و باید دسترسی جهانی به آن وجود داشته باشد. در مثال در سطح 15، کاپیتان از شما می خواهد که این الگو را برای کار زیر پیاده سازی کنید:
  1. نمونه ای از Singleton را با مقدار دهی اولیه تنبل پیدا کنید.

  2. با استفاده از همین اصل، سه کلاس singleton - خورشید، ماه، زمین - در فایل‌های جداگانه ایجاد کنید.

  3. پیاده سازیسیارهرابط در کلاس های خورشید ، ماه و زمین .

  4. در بلوک استاتیک از کلاس Solution ، را فراخوانی کنیدreadKeyFromConsoleAndInitPlanetروش.

  5. را اجرا کنیدreadKeyFromConsoleAndInitPlanetعملکرد روش:

    • 5.1. یک پارامتر String را از کنسول بخوانید

    • 5.2. اگر پارامتر برابر با یکی ازسیارهثابت های رابط، شی سیاره مناسب ایجاد کنید .

پس از مطالعه دقیق شرایط کار، می توانیم به وضوح متوجه شویم که چرا یک Singleton در اینجا مورد نیاز است. در واقع، از ما خواسته می شود که یک نمونه از هر یک از کلاس های زیر ایجاد کنیم: خورشید ، ماه ، زمین . منطقی است که فرض کنیم نباید بیش از یک خورشید/ماه/زمین ایجاد کنیم. در غیر این صورت، ما وارد یک موقعیت پوچ می شویم، مگر اینکه شما نسخه خود از جنگ ستارگان را بنویسید. پیاده سازی الگوی Singleton در جاوا در سه مرحله در جاوا، رفتار Singleton را نمی توان با استفاده از یک سازنده معمولی پیاده سازی کرد، زیرا سازنده همیشه یک شی جدید را برمی گرداند. بنابراین، تمام پیاده‌سازی‌های Singleton به مخفی کردن سازنده، ایجاد یک روش استاتیک عمومی که طول عمر شی سینگلتون را کنترل می‌کند، و «از بین بردن» تمام اشیاء تازه ظاهر شده خلاصه می‌شود. اگر به یک Singleton دسترسی داشت، یا باید یک شی جدید ایجاد کند (اگر قبلاً در برنامه وجود نداشته باشد)، یا یک موجود را برگرداند. برای انجام این کار:
  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 yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
مثال بالا تا حدودی ناشیانه است، زیرا ما به سادگی سازنده را مخفی می کنیم و روش خود را به جای یک سازنده استاندارد ارائه می دهیم. از آنجایی که هدف این مقاله این است که اطمینان حاصل شود که دانش‌آموزان CodeGym با این الگو (و به طور کلی الگوهای طراحی) در تماس هستند، تفاوت‌های ظریف پیاده‌سازی‌های تک‌تنه پیچیده‌تر در اینجا توضیح داده نخواهد شد. فقط توجه می کنیم که بسته به پیچیدگی برنامه، این الگو ممکن است نیاز به اصلاح بیشتر داشته باشد. به عنوان مثال، در یک محیط چند رشته ای (به مقالاتی در مورد رشته ها مراجعه کنید)، ممکن است چندین رشته مختلف به طور همزمان به روش singleton دسترسی داشته باشند و کد شرح داده شده در بالا کار نخواهد کرد، زیرا هر رشته جداگانه می تواند نمونه ای از کلاس را ایجاد کند. در نتیجه، هنوز چندین رویکرد مختلف برای ایجاد تک‌تنه‌های ایمن با نخ وجود دارد. اما این داستان دیگری است =)

و در نهایت ... این مقدار دهی اولیه تنبلی که کاپیتان در مورد آن پرسید چیست؟

به مقدار دهی اولیه تنبل، مقدار دهی اولیه معوق نیز گفته می شود. این یک ترفند برنامه نویسی است که در آن یک عملیات فشرده منابع (و ایجاد یک شی یک عملیات فشرده منابع است) بر اساس تقاضا و نه از قبل انجام می شود. بنابراین واقعاً در کد جاوا Singleton ما چه اتفاقی می‌افتد؟ به عبارت دیگر، شی ما در زمان دسترسی به آن ایجاد می شود، نه از قبل. شما نباید فرض کنید که مقداردهی اولیه تنبل به نوعی به الگوی Singleton گره خورده است . مقداردهی اولیه تنبل نیز در سایر الگوهای طراحی ایجادی مانند Proxy و Factory Method استفاده می شود، اما این نیز داستان دیگری است =)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION