JavaRush /Java blogi /Random-UZ /Patterns va Singleton - ularga birinchi marta duch kelgan...

Patterns va Singleton - ularga birinchi marta duch kelgan har bir kishi uchun

Guruhda nashr etilgan
Ushbu maqola naqsh tushunchasiga birinchi marta duch kelgan, Singleton"e" haqida eshitgan yoki uni qandaydir tarzda yaratgan, lekin hali ham hech narsani tushunmaganlarga qaratilgan. Xush kelibsiz! JavaRush talabalari birinchi marta 15-darajada naqshlarga duch kelishadi, kutilmaganda qopqoq naqshni Singletondangasa amalga oshirish bilan "tuzatish" va amalga oshirishni so'raydi. Bu haqda birinchi marta eshitgan talabalarda Singletondarhol bir nechta savollar tug'iladi: naqsh nima, u nima uchun kerak, bu qanday naqsh Singletonva nihoyat, bu qanday dangasa amalga oshirish. Keling, tartibda javob berishni boshlaylik: Patterns va Singleton - ularga birinchi marta duch kelgan har bir kishi uchun - 1

Qanday bo'lmasin, naqsh nima?

Yaxshiroq tushunish uchun, menimcha, bu savolga tarixdan javob berishga arziydi. Dasturchilar orasida shunday mashhur to'rtta muallif bor: Erich Gamma, Richard Helm, Ralf Jonson va Jon Vlissides, ular qiziqarli g'oyani ilgari surdilar.
Patterns va Singleton - ularga birinchi marta duch kelgan har bir kishi uchun - 2
Ular dasturlarni yozishda ko'pincha taxminan bir xil muammolarni hal qilishlari va strukturada bir xil turdagi kodlarni yozishlari kerakligini payqashdi. Shuning uchun ular ob'ektga yo'naltirilgan dasturlashda tez-tez ishlatiladigan tipik naqshlarni naqshlar shaklida tasvirlashga qaror qilishdi. Kitob 1995 yilda “Obyektga yo‘naltirilgan dizayn texnikasi. Dizayn naqshlari" . Kitobning nomi juda uzun bo'lib chiqdi va u shunchaki " To'rtlik to'dasi kitobi" nomi bilan mashhur bo'ldi . Birinchi nashrda 23 ta naqsh nashr etilgan, shundan keyin o'nlab boshqa naqshlar topilgan. Shunday qilib, ushbu paragrafdagi "Naqshlar nima?" Degan savolga javob berib , keling, bir necha so'z bilan xulosa qilaylik:
Naqsh - bu umumiy muammoning standartlashtirilgan echimi.
Va Singletonbu naqshlardan faqat bittasi.

Nima uchun bizga naqshlar kerak (dizayn naqshlari)

Siz naqshlarni bilmasdan dasturlashingiz mumkin; buni JavaRush-ning 15-darajasida siz yuzlab mini-dasturlarni ularning mavjudligi haqida hech narsa bilmasdan yozganligingizni anglash orqali tekshirishingiz mumkin. Bu shuni ko'rsatadiki, naqsh o'ziga xos vosita bo'lib, uning mavjudligi ustani havaskordan ajratib turadi:
Patterns va Singleton - ularga birinchi marta duch kelgan har bir kishi uchun - 3
Naqshlar odatiy muammolardan birini qanday qilib to'g'ri hal qilishni tasvirlaydi. Natijada, naqshlarni bilish vaqtni tejaydi. Algoritmlar bilan analogiya qilish mumkin. Misol uchun, siz blackjack va raqamlar bilan o'zingizning tartiblash algoritmingizni o'ylab topishingiz va unga ko'p vaqt sarflashingiz mumkin yoki siz allaqachon tasvirlanganidan foydalanishingiz va uni amalga oshirishingiz mumkin. Naqshlar bilan ham xuddi shunday. Bundan tashqari, naqshlardan foydalanish bilan kod yanada standartlashtiriladi va to'g'ri naqshlardan foydalanganda siz xatolarga yo'l qo'yish ehtimoli kamroq bo'ladi, chunki ular allaqachon oldindan ko'rsatilgan va ushbu naqshda yo'q qilingan. Bundan tashqari, hamma narsa, naqshlarni bilish dasturchilarga bir-birlarini yaxshiroq tushunishga imkon beradi. Hamkasblaringizga nima qilishni xohlayotganingizni tushuntirishga harakat qilish o'rniga, shablon nomini aytish kifoya. Xulosa qilib aytganda, dizayn naqshlari yordam beradi:
  • g'ildirakni qayta ixtiro qilmang, lekin standart echimlardan foydalaning;
  • kodni standartlashtirish;
  • terminologiyani standartlashtirish;
Ushbu bo'limni yakunlab, biz naqshlarning barcha turlarini uchta katta guruhga soddalashtirish mumkinligini ta'kidlaymiz:
Patterns va Singleton - ularga birinchi marta duch kelgan har bir kishi uchun - 4

Nihoyat Singleton naqsh

Singletongenerativ naqshlarga ishora qiladi . Uning so'zma-so'z tarjimasi yolg'iz. Ushbu naqsh sinfda faqat bitta ob'ektga (sinfning bitta nusxasi) ega bo'lishini va ushbu ob'ektga global kirish nuqtasi taqdim etilishini ta'minlaydi. Ta'rifdan ma'lum bo'lishi kerakki, ushbu naqsh ikki holatda qo'llanilishi kerak:
  1. dasturingizda biron bir sinfning bir nechta ob'ekti yaratilmasligi kerak. Masalan, kompyuter o'yinida sizda "Belgi" sinfi mavjud va bu sinfda xarakterning o'zini tasvirlaydigan faqat bitta ob'ekt bo'lishi kerak.

  2. sinf ob'ektiga global kirish nuqtasini taqdim etishingiz kerak bo'lganda. Boshqacha qilib aytganda, ob'ekt dasturning istalgan joyidan chaqirilishiga ishonch hosil qilishingiz kerak. Va, afsuski, buning uchun shunchaki global o'zgaruvchini yaratish etarli emas, chunki u yozishdan himoyalanmagan va har kim ushbu o'zgaruvchining qiymatini o'zgartirishi mumkin va ob'ektga global kirish nuqtasi yo'qoladi. Bu xususiyatlar Singleton, masalan, sizda ma'lumotlar bazasi bilan ishlaydigan sinf ob'ektiga ega bo'lganingizda va dasturning turli qismlaridan kirish mumkin bo'lgan ma'lumotlar bazasi kerak bo'lganda kerak bo'ladi. Va Singletonbu sinfning ilgari yaratilgan nusxasini boshqa hech qanday kod almashtirmaganligiga kafolat beradi.
Bu ikki muammo hal qilinadi Singleton: dasturda bitta ob'ekt bo'lishi va unga global kirish imkoniyati bo'lishi kerak. 15-darajali misolda qalpoq quyidagi vazifa uchun ushbu naqshni amalga oshirishni so'raydi (bu erda uning tavsifi):
Patterns va Singleton - ularga birinchi marta duch kelgan har bir kishi uchun - 5
Shartni diqqat bilan o'qib chiqqandan so'ng, Singletonbu erda nima uchun aynan (Yagona) kerakligi aniq bo'ladi. Axir, dastur har bir sinfning bitta ob'ektini yaratishni so'raydi: Sun, Moon, Earth. Va dasturdagi har bir sinf bittadan ko'p bo'lmagan Quyosh/Oy/Yerni yaratishi kerak deb taxmin qilish mantiqan to'g'ri, aks holda bu bema'nilik bo'ladi, agar siz Yulduzli urushlarning o'z versiyasini yozmasangiz. Java-ni uch bosqichda amalga oshirishSingleton xususiyati Java-da Singleton xatti-harakati oddiy konstruktor yordamida amalga oshirilmaydi, chunki konstruktor har doim yangi ob'ektni qaytaradi. Shuning uchun, "a" ning barcha ilovalari Singletonkonstruktorni yashirish va yagona ob'ekt mavjudligini boshqaradigan va barcha yangi paydo bo'lgan ob'ektlarni "yo'q qiladigan" umumiy statik usulni yaratishga to'g'ri keladi. Agar Singleton'a chaqirilsa, u yangi ob'ekt yaratishi kerak (agar u dasturda bo'lmasa) yoki allaqachon yaratilgan ob'ektni qaytarishi kerak. Buning uchun: №1. - Bitta ob'ektni o'z ichiga olgan sinfga shaxsiy statik maydon qo'shishingiz kerak:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – Sinf konstruktorini (standart konstruktor) shaxsiy qilib qo'ying (shunda unga kirish sinfdan tashqarida yopiladi, keyin u yangi ob'ektlarni qaytara olmaydi):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . – Singletonni olish uchun foydalaniladigan statik yaratish usulini e’lon qiling:
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
    }
}
Yuqoridagi misol biroz noqulay, chunki biz oddiygina konstruktorni yashiramiz va standart konstruktor o'rniga o'z uslubimizni taqdim etamiz. Ushbu maqola JavaRush talabalariga birinchi marta ushbu naqsh (va umuman naqshlar) bilan aloqa qilish imkonini berishga qaratilganligi sababli, bu erda murakkabroq Singletonlarni amalga oshirish xususiyatlari berilmaydi. Biz shuni ta'kidlaymizki, dasturning murakkabligiga qarab, ushbu naqshni batafsilroq takomillashtirish talab qilinishi mumkin. Misol uchun, ko'p tarmoqli muhitda (Treads mavzusiga qarang) bir vaqtning o'zida bir nechta turli mavzular Singletonning getter usulini chaqirishi mumkin va yuqorida tavsiflangan kod ishlashni to'xtatadi, chunki har bir alohida mavzu sinfning bir nechta nusxalarini yaratishi mumkin. birdaniga. Shu sababli, to'g'ri Thread-safe singletons yaratish uchun hali ham bir nechta turli yondashuvlar mavjud. Lekin bu boshqa hikoya =) Va nihoyat. Lazy Initialization nima ? Lazy Initialization dangasa ishga tushirish deb ham ataladi. Bu dasturlash usuli bo'lib, unda resursni ko'p talab qiladigan operatsiya (va ob'ektni yaratish resurs talab qiladigan operatsiya) oldindan emas, balki talab asosida amalga oshiriladi. Bu asosan bizning kodimizda sodir bo'ladi Singleton. Boshqacha qilib aytganda, bizning ob'ektimiz oldindan emas, balki unga kirish vaqtida yaratilgan. Dangasa ishga tushirish tushunchasi qandaydir tarzda "om" bilan qattiq bog'langan deb o'ylamaslik kerak Singleton. Lazy initsializatsiya boshqa generativ dizayn naqshlarida ham qo'llaniladi, masalan, Proksi va Zavod usulida, lekin bu boshqa hikoya =) Maqolani tayyorlashda quyidagi manbalardan foydalanilgan:
  1. Misollar bilan Java Singleton Dizayn Pattern eng yaxshi amaliyotlari
  2. Dizayn naqshlari
  3. Java-da to'g'ri Singleton
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION