JavaRush /Java блогы /Random-KK /Үлгілер мен синглтон - оларды бірінші рет кездестіргендер...

Үлгілер мен синглтон - оларды бірінші рет кездестіргендердің барлығына

Топта жарияланған
Бұл мақала үлгілер ұғымымен алғаш рет кездескен, Singleton«e» туралы естіген немесе оны қандай да бір жолмен жасаған, бірақ әлі ештеңе түсінбегендерге бағытталған. Қош келдіңіз! JavaRush студенттері үлгілерді 15-деңгейде бірінші рет кездестіреді, бұл кезде күтпеген жерден қалпақ жалқау Singletonіске асырумен үлгіні «түзетуді» және енгізуді сұрайды. Бұл туралы бірінші рет естіген студенттерде Singletonбірден көптеген сұрақтар туындайды: үлгі дегеніміз не, ол не үшін қажет, бұл қандай үлгі Singletonжәне ең соңында бұл қандай жалқау іске асыру. Жауапты ретімен бастайық: Үлгілер мен синглтон - оларды бірінші рет кездестіргендердің барлығы үшін - 1

Қалай болғанда да үлгі дегеніміз не?

Жақсырақ түсіну үшін бұл сұраққа тарихтан жауап берген жөн деп ойлаймын. Бағдарламалаушылардың арасында осындай атақты төрт автор бар: Эрих Гамма, Ричард Хельм, Ральф Джонсон және Джон Влиссайдс, олар қызықты идеяны ұсынды.
Үлгілер мен синглтон - оларды бірінші рет кездестіргендердің барлығы үшін - 2
Олар бағдарламаларды жазу кезінде көбінесе шамамен бірдей есептерді шешуге және құрылымында бір типтегі codeты жазуға тура келетінін байқады. Сондықтан олар an objectілі-бағытталған бағдарламалауда жиі қолданылатын типтік үлгілерді үлгілер түрінде сипаттауды шешті. Кітап 1995 жылы «Объектіге бағытталған дизайн техникасы. Дизайн үлгілері» . Кітаптың атауы тым ұзақ болып шықты және ол жай ғана « Төрттік банданың кітабы» деп аталды . Бірінші басылымда 23 үлгі жарияланды, содан кейін ондаған басқалары ашылды. Сонымен, осы абзацтағы «Үлгілер дегеніміз не?» деген сұраққа жауап бере отырып , бірнеше сөзбен қорытындылайық:
Үлгі - жалпы мәселенің стандартталған шешімі.
Және Singletonбұл үлгілердің бірі ғана.

Бізге үлгілер не үшін қажет (дизайн үлгілері)

Сіз үлгілерді білмей-ақ бағдарламалай аласыз; JavaRush-тің 15-ші деңгейінде сіз олардың бар екендігі туралы ештеңе білмей жүздеген мини-бағдарламаларды жазғаныңызды түсіну арқылы мұны тексере аласыз. Бұл үлгінің болуы шеберді әуесқойдан ерекшелендіретін құралдың бір түрі екенін көрсетеді:
Үлгілер мен синглтон - оларды бірінші рет кездестіргендердің барлығы үшін - 3
Үлгілер типтік есептердің бірін қалай дұрыс шешу керектігін сипаттайды. Нәтижесінде үлгілерді білу уақытты үнемдейді. Аналогияны алгоритмдер арқылы жасауға болады. Мысалы, сіз блэкджек пен сандармен өзіңіздің сұрыптау алгоритміңізді ойлап тауып , оған көп уақыт жұмсай аласыз немесе бұрыннан сипатталғанын пайдаланып, оны жүзеге асыра аласыз. Үлгілермен бірдей. Сонымен қатар, үлгілерді пайдалану арқылы code стандартталған болады және дұрыс үлгілерді пайдаланған кезде қателіктер жіберу ықтималдығы аз болады, өйткені олар осы үлгіде алдын ала қарастырылған және жойылған. Сонымен қатар, үлгілерді білу бағдарламашыларға бір-бірін жақсы түсінуге мүмкіндік береді. Бағдарламашы әріптестеріңізге олардың не істегіңіз келетінін түсіндіруге тырысудың орнына, үлгінің атын айту жеткілікті. Сонымен, қорытындылау үшін дизайн үлгілері көмектеседі:
  • дөңгелекті қайта ойлап таппаңыз, бірақ стандартты шешімдерді қолданыңыз;
  • codeты стандарттау;
  • терминологияны стандарттау;
Осы бөлімді қорытындылай келе, үлгілердің барлық алуан түрін үш үлкен топқа оңайлатуға болатындығын атап өтеміз:
Үлгілер мен синглтон - оларды бірінші рет кездестіргендердің барлығы үшін - 4

Соңында Singleton үлгісі

Singletonгенеративті үлгілерге жатады . Оның сөзбе-сөз аудармасы жалғыз. Бұл үлгі сыныпта бір ғана нысан (сыныптың бір данасы) бар екенін және сол нысанға ғаламдық қатынас нүктесінің қамтамасыз етілуін қамтамасыз етеді. Сипаттамадан бұл үлгіні екі жағдайда қолдану керек екендігі анық болуы керек:
  1. сіздің бағдарламаңызда кез келген класстың біреуден артық нысаны жасалмауы керек. Мысалы, компьютерлік ойында сізде «Кейіпкер» сыныбы бар және бұл сыныпта кейіпкердің өзін сипаттайтын бір ғана нысан болуы керек.

  2. сынып нысанына жаһандық кіру нүктесін беру қажет болғанда. Басқаша айтқанда, an object бағдарламаның кез келген жерінен шақырылатынына көз жеткізу керек. Және, өкінішке орай, бұл үшін жай ғана жаһандық айнымалыны жасау жеткіліксіз, өйткені ол жазудан қорғалмаған және кез келген адам осы айнымалы мәннің мәнін өзгерте алады және нысанға жаһандық кіру нүктесі жоғалады. Бұл сипаттар Singleton, мысалы, деректер қорымен жұмыс істейтін сыныптың an objectісі болған кезде және бағдарламаның әртүрлі бөліктерінен қол жетімді болуы үшін дерекқор қажет болғанда қажет. Бұл Singletonсыныптың бұрын жасалған данасын басқа ешбір code алмастырмағанына кепілдік береді.
Бұл екі мәселе мына арқылы шешіледі Singleton: бағдарламада бір an object болуы керек және оған ғаламдық қолжетімділік болуы керек. 15-деңгейдегі мысалда қалпақ келесі тапсырма үшін осы үлгіні енгізуді сұрайды (міне, оның сипаттамасы):
Үлгілер мен синглтон - оларды бірінші рет кездестіргендердің барлығы үшін - 5
Шартты мұқият оқып шыққаннан кейін Singletonбұл жерде дәл (Бірыңғай) не үшін қажет екені белгілі болады. Өйткені, бағдарлама әр класстың бір an objectісін құруды сұрайды: Sun, Moon, Earth. Бағдарламадағы әрбір сынып бір Күн/Ай/Жерден аспауы керек деп болжау қисынды, әйтпесе, әрине, сіз Жұлдызды соғыстардың жеке нұсқасын жазбасаңыз, бұл абсурд болады. Үш қадамда Java іске асыруSingleton мүмкіндігі Java тіліндегі Singleton әрекетін кәдімгі конструктор арқылы жүзеге асыру мүмкін емес, себебі конструктор әрқашан жаңа нысанды қайтарады. Сондықтан, «a»-ның барлық іске асырулары Singletonконструкторды жасыруға және бір нысанның бар болуын басқаратын және барлық жаңадан пайда болған нысандарды «жойатын» жалпыға ортақ статикалық әдісті жасауға келеді. Егер 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 студенттеріне осы үлгімен (және жалпы үлгілермен) алғаш рет байланыста болуға мүмкіндік беруге бағытталғандықтан, күрделірек синглтондардың іске асыру мүмкіндіктері мұнда берілмейді. Бағдарламаның күрделілігіне байланысты бұл үлгіні егжей-тегжейлі нақтылау қажет болуы мүмкін екенін ғана ескереміз. Мысалы, көп ағынды ортада (Treads тақырыбын қараңыз) бірнеше түрлі ағындар бір уақытта Singleton's getter әдісін шақыра алады және жоғарыда сипатталған code жұмысын тоқтатады, себебі әрбір жеке ағын сыныптың бірнеше данасын жасай алады. бірден. Сондықтан дұрыс Thread-қауіпсіз синглтондарды жасаудың бірнеше түрлі тәсілдері әлі де бар. Бірақ бұл басқа әңгіме =) Соңында. Жалқау инициализация деген не ? Бұл ресурсты көп қажет ететін операция (және an object жасау - ресурстарды қажет ететін операция) алдын ала емес, сұраныс бойынша орындалатын бағдарламалау әдісі. Бұл негізінен біздің codeымызда болады Singleton'a. Басқаша айтқанда, біздің нысан алдын ала емес, оған қол жеткізу сәтінде жасалады. Жалқау инициализация тұжырымдамасы қандай да бір түрде 'om-мен қатаң байланысты деп болжауға болмайды Singleton. Жалқау инициализация басқа генеративті дизайн үлгілерінде де қолданылады, мысалы, прокси және зауыттық әдісте, бірақ бұл басқа әңгіме =) Мақаланы дайындау кезінде келесі көздер пайдаланылды:
  1. Java Singleton дизайн үлгісінің мысалдары бар үздік тәжірибелері
  2. Дизайн үлгілері
  3. Java тіліндегі дұрыс синглтон
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION