JavaRush /Java Blogu /Random-AZ /Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər k...

Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər kəs üçün

Qrupda dərc edilmişdir
Bu məqalə naxış anlayışı ilə ilk dəfə qarşılaşan, Singleton'e' haqqında eşitmiş və ya bir şəkildə bunu etmiş, lakin hələ də heç nə başa düşməyənlərə yönəldilmişdir. Xoş gəldiniz! JavaRush tələbələri ilk dəfə 15-ci səviyyədə nümunələrlə qarşılaşırlar, o zaman gözlənilmədən qapaq Singletontənbəl tətbiqetmə ilə nümunəni “düzəltməyi” və həyata keçirməyi xahiş edir. Bu barədə ilk dəfə eşidən tələbələrdə Singletondərhal bir dəstə suallar yaranır: naxış nədir, nə üçün lazımdır, bu necə bir nümunədir Singletonvə nəhayət, bu necə tənbəl həyata keçirmədir. Sıra ilə cavab verməyə başlayaq: Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər kəs üçün - 1

Hər halda bir nümunə nədir?

Daha yaxşı başa düşmək üçün hesab edirəm ki, tarixdən bu suala cavab verməyə dəyər. Proqramçılar arasında belə məşhur dörd müəllif var: Erich Gamma, Richard Helm, Ralph Johnson və John Vlissides, onlar maraqlı ideya ilə çıxış ediblər.
Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər kəs üçün - 2
Onlar qeyd etdilər ki, proqramlar yazarkən çox vaxt təxminən eyni problemləri həll etməli və strukturda eyni tipli kod yazmalı olurlar. Buna görə də, onlar obyekt yönümlü proqramlaşdırmada tez-tez istifadə olunan tipik nümunələri nümunələr şəklində təsvir etmək qərarına gəldilər. Kitab 1995-ci ildə “Obyekt yönümlü dizaynın texnikaları. Dizayn nümunələri" . Kitabın adı çox uzun oldu və o, sadəcə olaraq Dördlər Dəstəsinin Kitabı kimi tanındı . Birinci nəşrdə 23 naxış nəşr olundu, ondan sonra onlarla başqa nümunə aşkar edildi. Beləliklə, bu paraqrafdakı “Nümunələr nədir?” sualına cavab verərək , bir neçə sözlə ümumiləşdirək:
Nümunə ümumi bir problemin standart həllidir.
Singletonbu nümunələrdən yalnız biridir.

Nə üçün bizə nümunələr lazımdır (dizayn nümunələri)

Nümunələri bilmədən proqramlaşdıra bilərsiniz; JavaRush-da 15-ci səviyyəyə qədər yüzlərlə mini-proqramları onların varlığı haqqında heç nə bilmədən yazdığınızı dərk etməklə bunu yoxlaya bilərsiniz. Bu, bir nümunənin bir ustanı həvəskardan fərqləndirən bir növ alət olduğunu göstərir:
Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər kəs üçün - 3
Nümunələr tipik problemlərdən birinin necə düzgün həll olunacağını təsvir edir. Nəticədə nümunələri bilmək vaxtınıza qənaət edir. Alqoritmlərlə bənzətmə etmək olar. Məsələn, siz blackjack və rəqəmlərlə öz çeşidləmə alqoritminizi tapıb ona çox vaxt sərf edə bilərsiniz, ya da artıq çoxdan təsvir olunandan istifadə edib onu həyata keçirə bilərsiniz. Naxışlarla eynidir. Üstəlik, naxışların istifadəsi ilə kod daha standartlaşdırılır və düzgün nümunələrdən istifadə edərkən səhv etmək ehtimalınız az olacaq, çünki onlar bu nümunədə əvvəlcədən nəzərdə tutulmuş və aradan qaldırılmışdır. Yaxşı, üstəlik hər şey, nümunələr haqqında bilik proqramçılara bir-birlərini daha yaxşı başa düşməyə imkan verir. Proqramçı yoldaşlarınıza nə etmək istədiyinizi izah etməyə çalışmaq əvəzinə, sadəcə olaraq şablonun adını demək kifayətdir. Beləliklə, ümumiləşdirmək üçün dizayn nümunələri kömək edir:
  • təkəri yenidən kəşf etməyin, lakin standart həllərdən istifadə edin;
  • kodu standartlaşdırmaq;
  • terminologiyanı standartlaşdırmaq;
Bu bölmənin sonunda qeyd edirik ki, bütün müxtəlif naxışlar üç böyük qrupa sadələşdirilə bilər:
Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər kəs üçün - 4

Nəhayət, Singleton nümunəsi

Singletongenerativ nümunələrə istinad edir . Onun hərfi tərcüməsi yalnızdır. Bu nümunə sinfin yalnız bir obyektə (sinfin bir nümunəsi) malik olmasını və həmin obyektə qlobal giriş nöqtəsinin təmin edilməsini təmin edir. Təsvirdən aydın olmalıdır ki, bu nümunə iki halda istifadə edilməlidir:
  1. proqramınızda hər hansı bir sinifin birdən çox obyekti yaradılmadıqda. Məsələn, kompüter oyununda sizin “Xarakter” sinifiniz var və bu sinifdə xarakterin özünü təsvir edən yalnız bir obyekt olmalıdır.

  2. sinif obyektinə qlobal giriş nöqtəsi təmin etmək lazım olduqda. Başqa sözlə, obyektin proqramın istənilən yerindən çağırıldığına əmin olmaq lazımdır. Və təəssüf ki, bunun üçün sadəcə qlobal dəyişən yaratmaq kifayət deyil, çünki o, yazmadan qorunmur və hər kəs bu dəyişənin dəyərini dəyişə bilər və obyektə qlobal giriş nöqtəsi itiriləcəkdir. Bu xassələrə Singleton, məsələn, verilənlər bazası ilə işləyən sinif obyekti olduqda və proqramın müxtəlif hissələrindən əldə edilə bilən verilənlər bazasına ehtiyacınız olduqda lazımdır. Və Singletonbu, heç bir başqa kodun sinifin əvvəllər yaradılmış nümunəsini əvəz etmədiyinə zəmanət verəcəkdir.
Bu iki problem həll olunur Singleton: proqramda bir obyekt olmalıdır və ona qlobal giriş olmalıdır. 15-ci səviyyəli nümunədə qapaq bu nümunəni aşağıdakı tapşırıq üçün həyata keçirməyi xahiş edir (burada onun təsviri):
Patterns və Singleton - onlarla ilk dəfə qarşılaşan hər kəs üçün - 5
Şərti diqqətlə oxuduqdan sonra Singletonburada tam olaraq (Tək) nə üçün lazım olduğu aydın olur. Axı proqram sizdən hər bir sinifdən bir obyekt yaratmağı xahiş edir: Sun, Moon, Earth. Proqramdakı hər bir sinifin birdən çox Günəş/Ay/Yer yaratmadığını güman etmək məntiqlidir, əks halda bu, əlbəttə ki, Ulduz Döyüşlərinin öz versiyasını yazmırsınızsa, bu, absurd olacaq. Java-nın üç addımda tətbiqiSingleton xüsusiyyəti Java-da Singleton davranışı adi konstruktordan istifadə etməklə həyata keçirilə bilməz, çünki konstruktor həmişə yeni obyekt qaytarır. Buna görə də, 'a'nın bütün tətbiqləri Singletonkonstruktoru gizlətməyə və tək bir obyektin varlığına nəzarət edəcək və bütün yeni görünən obyektləri "məhv edəcək" ictimai statik metod yaratmağa başlayır. Əgər Singleton'a çağırılırsa, o, ya yeni obyekt yaratmalıdır (əgər o, artıq proqramda deyilsə) və ya artıq yaradılmış obyekti qaytarmalıdır. Bunu etmək üçün: # 1. – Tək obyekti olan sinifə şəxsi statik sahə əlavə etməlisiniz:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – Sinif konstruktorunu (standart konstruktoru) özəl edin (onlara giriş sinifdən kənarda bağlansın, o zaman yeni obyektləri qaytara bilməyəcək):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . – Singilton əldə etmək üçün istifadə olunacaq statik yaratma metodunu elan edin:
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
    }
}
Yuxarıdakı nümunə bir qədər yöndəmsizdir, çünki biz sadəcə olaraq konstruktoru gizlədirik və standart konstruktor əvəzinə öz metodumuzu təqdim edirik. Bu məqalə JavaRush tələbələrinin ilk dəfə bu nümunə ilə (və ümumiyyətlə nümunələrlə) təmasda olmasını təmin etmək məqsədi daşıdığından, daha mürəkkəb Singletonların tətbiqi xüsusiyyətləri burada verilməyəcək. Yalnız qeyd edirik ki, proqramın mürəkkəbliyindən asılı olaraq, bu nümunənin daha ətraflı dəqiqləşdirilməsi tələb oluna bilər. Məsələn, çox yivli mühitdə (Mövzular mövzusuna baxın) bir neçə fərqli mövzu eyni vaxtda Singleton-un alıcı metodunu çağıra bilər və yuxarıda təsvir edilən kod işləməyi dayandıracaq, çünki hər bir fərdi ip sinifin çoxsaylı nümunələrini yarada biləcəkdir. bir anda. Buna görə də, düzgün Thread-safe singletons yaratmaq üçün hələ də bir neçə fərqli yanaşma var. Amma bu başqa hekayə =) Və nəhayət. Başlığın tələb etdiyi Lazy Initialization nədir ? Lazy Initialization həmçinin tənbəl başlatma adlanır. Bu, resurs tutumlu əməliyyatın (və obyekt yaratmaq resurs tələb edən əməliyyatdır) əvvəlcədən deyil, tələb əsasında yerinə yetirildiyi proqramlaşdırma texnikasıdır. Əsasən kodumuzda baş verənlər Singleton'a. Başqa sözlə, obyektimiz əvvəlcədən deyil, ona daxil olduğu anda yaradılır. Tənbəl başlatma anlayışının bir şəkildə Singleton'om ilə ciddi şəkildə əlaqəli olduğunu düşünmək lazım deyil. Tənbəl başlatma digər generativ dizayn nümunələrində də istifadə olunur, məsələn, Proksi və Fabrika Metodunda, lakin bu başqa hekayədir =) Məqalənin hazırlanmasında aşağıdakı mənbələrdən istifadə edilmişdir:
  1. Nümunələrlə Java Singleton Dizayn Pattern Ən Yaxşı Təcrübələri
  2. Dizayn Nümunələri
  3. Java-da düzgün Singleton
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION