JavaRush /Блоги Java /Random-TG /Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо ...

Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо онҳо дучор омадаанд

Дар гурӯҳ нашр шудааст
Ин мақола ба онҳое нигаронида шудааст, ки бори аввал бо мафҳуми нақшҳо дучор омадаанд, дар бораи Singleton'e шунидаанд ва ё бо ягон роҳ онро сохтаанд, аммо ҳанӯз чизеро нафаҳмидаанд. Хуш омадед! Донишҷӯёни JavaRush бори аввал бо намунаҳо дар сатҳи 15 рӯбарӯ мешаванд, вақте ки ногаҳон сарпӯш хоҳиш мекунад, ки намунаро Singletonбо татбиқи танбалӣ “ислоҳ” ва татбиқ кунад. Донишҷӯёне, ки бори аввал дар ин бора мешунаванд, Singletonдарҳол саволҳои зиёде пайдо мекунанд: намуна чист, он барои чӣ лозим аст, он чӣ гуна намуна аст Singletonва ниҳоят ин чӣ гуна татбиқи танбалӣ аст. Биёед ҷавобро бо тартиб оғоз кунем: Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо онҳо дучор омадаанд - 1

Ба ҳар ҳол намуна чист?

Барои фаҳмиши беҳтар, ман фикр мекунам, ки ба ин савол аз таърих посух додан лозим аст. Дар байни барномасозон чунин чаҳор муаллифи машҳур вуҷуд доранд: Эрих Гамма, Ричард Ҳелм, Ралф Ҷонсон ва Ҷон Влиссайдс, ки бо як идеяи ҷолиб баромад карданд.
Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо онҳо дучор омадаанд - 2
Онҳо пай бурданд, ки ҳангоми навиштани барномаҳо ба онҳо лозим меояд, ки тақрибан як масъаларо ҳал кунанд ва codeи як намуди сохторро нависад. Аз ин рӯ, онҳо тасмим гирифтанд, ки дар шакли намунаҳо намунаҳои хосро тавсиф кунанд, ки аксар вақт дар барномасозии ба an object нигаронидашуда истифода мешаванд. Китоб соли 1995 таҳти унвони «Техникаҳои тарҳрезии ба an object нигаронидашуда. Намунаҳои тарроҳӣ" . Номи китоб хеле дароз шуд ва он танҳо бо номи " Китоби гурӯҳи чаҳоргона" маъруф шуд . Дар нашри аввал 23 нақш нашр шуд, ки баъд аз он даҳҳо намунаи дигар кашф гардид. Ҳамин тавр, ба саволи ин параграф ҷавоб дода, "Намудҳо чистанд?" , биёед бо чанд калима ҷамъбаст кунем:
Намуна як ҳалли стандартишудаи мушкилоти умумӣ мебошад.
Ва Singletonин танҳо яке аз ин намунаҳост.

Чаро ба мо намунаҳо лозиманд (намудҳои тарроҳӣ)

Шумо метавонед бидуни надонистани намунаҳо барномарезӣ кунед; шумо метавонед инро танҳо бо фаҳмидани он, ки дар сатҳи 15-ум дар JavaRush шумо садҳо барномаҳои мини-барномаҳо навиштаед, бидуни ҳеҷ чиз дар бораи мавҷудияти онҳо. Ин аз он шаҳодат медиҳад, ки нақш як навъ асбобест, ки мавҷудияти он усторо аз ҳаваскор фарқ мекунад:
Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо онҳо дучор омадаанд - 3
Намунаҳо тарзи дурусти ҳалли яке аз масъалаҳои маъмулиро тасвир мекунанд. Дар натиҷа, донистани намунаҳо вақти шуморо сарфа мекунад. Бо алгоритмҳо аналогия кардан мумкин аст. Масалан, шумо метавонед як алгоритми ҷудокунии худро бо blackjack ва рақамҳо пайдо кунед ва вақти зиёдро барои он сарф кунед, ё шумо метавонед аз як алгоритми кайҳо тавсифшуда истифода баред ва онро амалӣ кунед. Бо намунаҳо ҳамин тавр аст. Илова бар ин, бо истифода аз намунаҳо, рамз бештар стандартизатсия мешавад ва ҳангоми истифодаи намунаҳои дуруст, шумо эҳтимоли камтар ба хатогиҳо дучор хоҳед шуд, зеро онҳо аллакай дар ин қолаб пешбинӣ ва бартараф карда шудаанд. Хуб, илова бар ҳама чиз, дониши намунаҳо ба барномасозон имкон медиҳад, ки ҳамдигарро беҳтар фаҳманд. Ба ҷои он ки кӯшиш кунед, ки ба барномасозони худ фаҳмонед, ки шумо аз онҳо чӣ кор кардан мехоҳед, танҳо гуфтани номи қолаб кифоя аст. Ҳамин тавр, барои ҷамъбаст, намунаҳои тарроҳӣ кӯмак мекунанд:
  • чархро аз нав ихтироъ накунед, балки аз усулхои стандартй истифода баред;
  • стандартизатсияи code;
  • стандартизатсияи истилоҳот;
Дар хотимаи ин бахш, мо қайд мекунем, ки тамоми намудҳои намунаҳоро ба се гурӯҳи калон содда кардан мумкин аст:
Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо онҳо дучор омадаанд - 4

Дар ниҳоят як намунаи Singleton

Singletonба намунаҳои тавлидӣ ишора мекунад . Тарҷумаи аслии он танҳост. Ин намуна кафолат медиҳад, ки синф танҳо як an object дорад (як мисоли синф) ва нуқтаи дастрасии глобалӣ ба он an object таъмин карда мешавад. Аз тавсиф бояд равшан бошад, ки ин намуна бояд дар ду ҳолат истифода шавад:
  1. вақте ки дар барномаи шумо набояд зиёда аз як an objectи ягон синф сохта шавад. Масалан, дар бозии компютерӣ шумо синфи "Характер" доред ва ин синф бояд танҳо як an object дошта бошад, ки худи персонажро тавсиф мекунад.

  2. вақте ки шумо бояд нуқтаи дастрасии глобалиро ба an objectи синф таъмин кунед. Ба ибораи дигар, шумо бояд боварӣ ҳосил кунед, ки an object аз дилхоҳ ҷои барнома даъват карда мешавад. Ва афсӯс, ки барои ин танҳо эҷод кардани як тағирёбандаи глобалӣ кофӣ нест, зеро он аз навиштан муҳофизат карда нашудааст ва ҳар кас метавонад арзиши ин тағирёбандаро тағир диҳад ва нуқтаи дастрасии глобалӣ ба an object гум мешавад. Ин хосиятҳо Singletonлозиманд, масалан, вақте ки шумо an objectи синфе доред, ки бо пойгоҳи додаҳо кор мекунад ва ба шумо лозим аст, ки базаи маълумот аз қисмҳои гуногуни барнома дастрас бошад. Ва Singletonон кафолат медиҳад, ки ягон рамзи дигар намунаи қаблан сохташудаи синфро иваз накардааст.
Ин ду масъаларо тавассути - ҳал мекунанд Singleton: дар барнома бояд як an object мавҷуд бошад ва дастрасии глобалӣ ба он мавҷуд бошад. Дар мисоли сатҳи 15, сарпӯш дархост мекунад, ки ин намунаро барои вазифаи зерин татбиқ кунад (дар ин ҷо тавсифи он аст):
Намунаҳо ва Singleton - барои ҳар касе, ки бори аввал бо онҳо дучор омадаанд - 5
Пас аз бодиққат хондани шарт, маълум мешавад, ки чаро маҳз Singleton(Single) дар ин ҷо лозим аст. Баъд аз ҳама, барнома аз шумо хоҳиш мекунад, ки як an objectи ҳар як синф эҷод кунед: Sun, Moon, Earth. Ва мантиқист, ки ҳар як синф дар барнома на бештар аз як Офтоб/Моҳ/Заминро эҷод кунад, вагарна ин бемаънӣ хоҳад буд, агар албатта versionи шахсии Ҷангҳои Ситораро нанависед. Хусусияти татбиқи SingletonJava дар се марҳила Рафтори Singleton дар Java наметавонад бо истифода аз созандаи муқаррарӣ амалӣ карда шавад, зеро созанда ҳамеша an objectи навро бармегардонад. Аз ин рӯ, ҳама татбиқи Singleton"a" ба пинҳон кардани конструктор ва эҷоди усули статикии оммавӣ, ки мавҷудияти як an objectро назорат мекунад ва ҳама an objectҳои нав пайдошударо "нобуд" мекунад. Агар Singleton'a даъват шавад, он бояд ё an objectи нав эҷод кунад (агар он аллакай дар барнома набошад) ё an objectи аллакай сохташударо баргардонад. Барои ин: №1. - Шумо бояд майдони хусусии статикиро ба синфе илова кунед, ки дорои як an object аст:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – Созандаи синфро (конструктори пешфарз) хусусӣ созед (то он ки дастрасӣ ба он берун аз синф баста шавад, он гоҳ an objectҳои навро баргардонида наметавонад):
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 бори аввал бо ин намуна (ва дар маҷмӯъ намунаҳо) тамос гиранд, хусусиятҳои татбиқи Singletons мураккабтар дар ин ҷо дода намешаванд. Мо танҳо қайд мекунем, ки вобаста ба мураккабии барнома, метавонад такмor муфассали ин намуна талаб карда шавад. Масалан, дар муҳити чанд ришта (ниг. ба мавзӯи Threads), якчанд риштаҳои гуногун метавонанд ҳамзамон усули Getter Singleton-ро даъват кунанд ва codeи дар боло тавсифшуда корашро қатъ мекунад, зеро ҳар як риштаи инфиродӣ метавонад якчанд мисолҳои синфро эҷод кунад. якбора. Аз ин рӯ, то ҳол якчанд равишҳои гуногун барои эҷоди синглтонҳои дурусти Thread-бехатар вуҷуд доранд. Аммо ин як ҳикояи дигар аст =) Ва ниҳоят. Lazy Initialization, ки cap талаб кардааст, чист ? Ин як техникаи барномасозӣ аст, ки дар он амалиёти захираҳо (ва эҷод кардани an object як амалиёти серталаб аст) на пешакӣ, балки тибқи талабот иҷро карда мешавад. Ки аслан он чизест, ки дар codeекси мо Singleton'a. Ба ибораи дигар, an objectи мо дар лаҳзаи дастрасӣ ба он сохта мешавад, на пешакӣ. Набояд гумон кард, ки мафҳуми ибтидосозии танбал ба таври қатъӣ бо Singleton"ом" алоқаманд аст. Ташаббуси танбалӣ инчунин дар дигар шаклҳои тарроҳии тавлидӣ истифода мешавад, масалан дар Proxy ва Factory Method, аммо ин як ҳикояи дигар аст =) Дар таҳияи мақола манбаъҳои зерин истифода шудаанд:
  1. Таҷрибаҳои беҳтарини тарҳрезии Java Singleton бо мисолҳо
  2. Намунаҳои тарроҳӣ
  3. Singleton дуруст дар Java
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION