univerza v mariboru fakulteta za elektrotehniko racunalnistvo in informatiko e posta tomaz domajnko uni mb si url http lisa uni mb si povzetek kljub temu da objektna tehnologija vzpodbuja ponovno uporabo na visjih nivojih abstrakcije pa se najveckrat ne zadevamo da te pristope uporabljamo tudi na nivoju programske kode v prispevku bomo prikazali da predstavlja uporaba naprednih pristopov k razvoju enega od osnovnih nacinov dela s programskim jezikom java pravzaprav edini nacin pokazali bomo da lahko skozi delo z jezikom java identificiramo mnoge vzorce ki so sicer v literaturi opisani kot element ponovne uporabe na najvisjem nivoju abstrakcije v sklopu prispevka bomo prikazali kako lahko tudi manj izkuseni razvijalci izkoristijo to lastnost jezika in s tem produktivneje in natancneje resujejo problemske situacije uvod izkusnje so tiste ki naredijo iznajdljivega in izkusenega razvijalca mnogo produktivnejsega od njegovega inteligentnega a neizkusenega sodelavca izkusnje dajejo razvijalcu raznolikost njegove modrosti v casu ko razvijalci pridobivajo izkusnje pricnejo razpoznavati podobnosti problemskih situacij s situacijami iz preteklosti kasneje pricnejo razvijalci spoznavati da resitve podobnih problemov sledijo ponavljajocim se vzorcem poznavanje vzorcev pa nato izkuseni razvijalci izkoristijo sebi v prid saj hitreje razpoznajo problemsko situacijo s pomocjo vzorca pa lahko idejo resitve aplicirajo neposredno brez potrebe po natancni in dolgotrajni analizi problema in iskanja primerne resitve hkrati pa se poveca tudi verjetnost da je bila izbrana resitev res pravilna odlocitev saj vsak vzorec nosi tudi informacije o tem kako je bila resitev uporabljena v preteklosti in do kaksnih rezultatov je privedla razvijalec torej izkorisca izkusnje ko razvijalec odkrije vzorec je v resnici to samo trenuten pogled na problemsko situacijo in idejo resitve praviloma je pot od te tocke do popolnoma analizirane in pojasnjene ideje v obliki vzorca ki jo razvijalec lahko enostavno besedno definira zelo dolga in zahtevna seveda pa je tak postopek dragocena nalozba v prihodnost kajti ko je razvijalec sposoben vzorec opisati z mnozico besed ga je sposoben kombinirati z drugimi vzorci kar je se pomembneje vzorec ki je predstavljen z besedami je lahko predmet diskusije vecih razvijalcev ki vzorec bolj ali manj natancno poznajo to omogoca razvijalcem lazje sodelovanje in kombiniranje znanja taksna predstavitev omogoca razpravo tako o primernosti resitve problema kot tudi usklajevanju besednjaka razvijalcev vse preveckrat se namrec dogaja da razvijalci govorijo o ekvivalentni resitve istega problema pa zaradi razlicne predstavitve ne najdejo skupnega izhodisca do tega trenutka pa se nismo dotaknili verjetno najpomembnejsega pomena zapisa vzorca s pomocjo besed to je moznost da si manj izkuseni razvijalci ki vzorcev se niso sposobni odkrivati s pomocjo mentorjev to je izkusenih razvijalcev in s pomocjo zapisa vzorcev pridobijo dodatne izkusnje in znanje o tem kako resevati dolocene problemske situacije v prvi fazi se naucijo vzorce uporabljati kasneje pa tudi samostojnega odkrivanja vzorcev na drugi strani pa predstavlja java s svojimi lastnostmi razvojni jezik z ogromnim potencialom neodvisnost od okolja v katerem se aplikacije izvrsujejo in popolna objektna usmerjenost sta zadostni znacilnosti zaradi katerih je veliko razvijalcev izbralo prav jezik java kot svoj razvojni jezik kljub temu pa kompleksnost danasnjih sistemov in stanje na podrocju razvijalcev kazejo na dejstvo da je potrebno razvoj poenostaviti ce povemo drugace je v razvoj potrebno vpeljati nove elemente ki bodo razvijalcem v pomoc vzorci o katerih smo govorili v prejsnjem poglavju predstavljajo eno takih moznosti in v prispevku bomo pokazali da so vzorci globoko vtkani v samo delo z jezikom java kar privede do dolocenih prednosti vzorci ce pricnemo poglavje kar z definicijo vzorca kot ga je podal c alexander vzorec opisuje problem ki se veckrat pojavlja v nasem okolju podaja jedro njegove resitve na tak nacin da lahko idejo resitve uporabimo v milijon razlicnih primerih ne da bi pot od ideje do resitve prehodili na enak nacin jedro vzorca je torej zapis izkusenj ki so v preteklosti vodile do nekega rezultata ki je bil za avtorja vzorca dovolj pomemben lahko je to popolna resitev problema ali pa samo usmeritev ki kaze na smer resevanja ki najveckrat prinese rezultate hkrati raziskave kazejo da zaposleni s srednjim do dolgim casom dela v podjetju precej pogosto menjujejo delovna mesta in s seboj odnasajo vecino svojih izkusenj tako podjetje izgubi informacijo o resitvah ki so v preteklosti vodile do uspehov pa tudi neuspehov te izkusnje se pridobijo skozi daljse casovno obdobje hkrati pa to pomeni da mladi clani z razmeroma malo izkusnjami le stezka v krajsem roku nadomestijo izpadle izkusnje v teh situacijah se vzorci izkazejo kot odlicno sredstvo hranjenja informacij prenosa znanja in posredovanja izkusenj med zaposlenimi jasno je da se informacija med razlicnimi ljudmi lahko ucinkovito siri le z dolocenim bolj ali manj formalnim zapisom a formalnost predstavitve vzorcev nikakor ni pogoj da se vzorci vpeljejo v razvojne projekte zadnjih nekaj let krog ljudi ki tvorijo ti paterns movement hitro raste ljudje prihajajo iz razlicnih podrocij njihov skupni interes pa je zdruziti znanje ki v okolju informacijskih sistemov ze obstaja ter ga cim bolje izkoristiti za resevanje novih problemov to seveda pomeni da je danes ze mogoce najti vzorce ki pomagajo pri resevanju mnogih problemov ki nastanejo ob razvoju modernega informacijskega sistema in kaj je v tem trenutku lahko naprednejse kot uporaba programskega jezika java pri razvoju novih v svetovno omrezje vpetih informacijskih sistemov kombinacija jave in vzorcev objektna orientacija je v srediscu definicije jezika java to seveda pomeni da aplikativen program v resnici obstaja kot mnozica med seboj povezan objektov ki z medsebojno komunikacijo s pomocjo sporocil zagotavljajo dolocene funkcionalnosti v resnici gre torej pri razvoju aplikativne resitve za povezovanje objektov v celoto korak in dolocanje njihovega medsebojnega sodelovanja korak jasno je da se pri razvoju pricnejo pojavljati tezave in kar je vzpodbudno pricnejo se ponavljati tudi pristopi k resevanju teh situacij torej tocno to kar smo v prejsnjem poglavju definirali kot vzorec v poglavju bomo prikazali da je v vsakem izmed teh dveh korakov skrita obilica vzorcev in s pomocjo bolj podrobnega poznavanja teh vzorcev lahko posamezne korake poenostavimo ali vsaj pojasnimo v doloceni meri lahko recemo da smo resevanje avtomatizirali saj odpade iskanje resitve ampak preostane samo njena aplikacija v doloceno problemsko situacijo v nadaljevanju poglavja bo nastetih nekaj vzorcev ki jih kaj hitro zasledimo v casu razvoja aplikacije seveda seznam nikakor ne bo popoln temvec predstavlja bolj motivacijo da se bralec tudi sam spopade z odkrivanjem vzorcev v jeziku java koristi takega pocetja so lahko samo pozitivne vzorec edinec vzorec in java veckrat se zgodi da moramo zagotoviti samo en primerek razreda ki je lahko aktiven v nasi aplikaciji primere tega najdemo tudi v javi tako je razred java lang runtime razred edinec to pomeni da ima vsaka aplikacija samo en primerek tega razreda ki pa si ga lahko deli vec objektov slika prikazuje izsek iz dokumentacije ki potrjuje naso trditev public class runtime extends object every java application has a single instance of class runtime that allows the application to interface with the environment in which the application is running the current runtime can be obtained from the getruntime method an application cannot create its own instance of this class getruntime public static runtime getruntime returns the runtime object associated with the current java application most of the methods of class runtime are instance methods and must be invoked with respect to the current runtime object returns the runtime object associated with the current java application slika uporaba vzorca edinec v javi opis vzorca edinec vzorec edinec zagotovi kreiranje enega samega primerka razreda vsi razredi ki uporabljajo objekte tega razreda uporabljajo en sam primerek praviloma so to razredi ki centralno upravljajo z dolocenimi sredstvi povezava do podatkovne baze statistika prevajalnika za take razrede je znacilno da kreirajo primerek samo enkrat in ga nato posredujejo vsem zahtevnikom objektom ki zahtevajo primerek tega razreda jasno je da ne smemo dovoliti uporabniku da bi kreiral vec kot en primerek razreda kar implementiramo tako da konstruktorsko metodo skrijemo izdelamo skrito ali zasciteno metodo in oblikujemo staticno metodo ki vraca instanco razreda seveda mora biti ta staticna metoda primerno implementirana da kreira en sam primerek razreda dovoljena je tudi posplositev vzorca edinec kjer stevilo objektov lahko dolocamo dinamicno kar dovoljuje razlicne namene uporabe ki imajo skupno mnozico objektov dolocene velikosti npr mnozica niti mnozica objektov za predpomnjenje vse to je vidno iz dokumentacije razreda java lang runtime ki predstavlja uporabo tega vzorca v jeziku java vzorec ovojnica vzorec in java uporaba vhodno izhodnih nizov v javi ima dolocene znacilnosti ki jih lahko razpoznamo kot vzorec ovojnica java namrec dopusca dinamicno razsirjanje funkcionalnosti razredov s tem da s pomocjo enega primerka objekta ovijemo primerke drugih razredov in nato uporabljamo njihove funkcionalnosti to seveda predstavlja mocno alternativo dedovanju kjer je tako razsirjanje funkcionalnosti staticno natancno doloceno v casu prevajanja tipicno uporabo v javi prikazuje slika na tej sliki objekt tipa filereader sposobnost branja iz datoteke ovijemo z objektom tipa bufferreader npr branje celih stevil da dobimo kompleksen objekt ki zna prebrati cela stevila neposredno iz datoteke filereader fr new filereader datoteka bufferreader br new bufferreader fr int i br read pushbackreader pr new pushbackreader br pr unread i slika uporaba vzorca ovojnica kot lahko vidimo na sliki java s pomocjo uporabe vzorca ovojnica ki v resnici ostaja skrit pred uporabnikom omogoca dinamicno dodajanje ali odvzemanje funkcionalnosti ce pa pogledamo na primer kode malce natancneje bomo spoznali polno moc vzorca ta namrec omogoca dinamicno dodajanje ali odvzemanje funkcionalnosti posameznim objektom tudi s funkcionalnostjo razredov ki v casu prevajanja sploh niso poznali ali sploh implementirani seveda pa tak pristop zahteva upostevanje nekaterih pravil ki bodo nasteta v opisu vzorca opis vzorca ovojnica vzorec ovojnica razsirja funkcionalnost enega objekta na nacin ki je neviden uporabnikom to naredi na tako da uporablja primerek podrazreda osnovnega razreda ki delegira operacije do osnovnega razreda do taksne situacije prihaja takrat ko razsirjanje funkcionalnosti s pomocjo dedovanja ni primerno je zahtevano dinamicno razsirjanje funkcionalnosti ali pa je omogoceno dinamicno omejevanje funkcionalnosti slika prikazuje razredni diagram vzorca slika vzorec ovojnica jasno je da omogoca vzorec ovojnica vecjo fleksibilnost kot dedovanje hkrati pa je zaradi delegacije operacije performancno bolj zahtevna resitev uporaba vzorca tudi pomeni da vnaprej ne moremo predvideti vseh moznih kombinacij hkrati pa moramo koncnemu uporabniku razvijalcu prepustiti odgovornost da ne uporabi taksne kombinacije ki ne bi delovala oziroma bi povzrocila smrtni objem razvijalec ustvari kombinacijo kjer se zahteva delegira v zaprtem krogu vzorec delegacija vzorec in java v jeziku java najdemo vec primerov uporabe delegacije delegacija je osnova javinega modela delegacije dogodkov java delegation event model v tem modelu izvorni objekt dogodka posilja dogodke objektu poslusalec event listener izvorni objekt dogodka praviloma ne odloca o tem kaj narediti s posameznim dogodkom namesto tega delegira odgovornost procesiranja objektu poslusalcu poglejmo si primer kode ki jasno kaze na dejstvo uporabe delegacije kot osnovnega mehanizma razsirjanja funkcionalnosti prikazan je na sliki na sliki vidimo da kot poslusalec kar pravzaprav predstavlja instanco vzorca pod imenom poslusalec in doloca odgovornosti posameznih objektov prijavimo objekt tipa testapplet ta pa delegira sporocila ustreznim objektom public class testapplet extends applet implements java awt event actionlistener public void actionperformed java awt event actionevent e if e getsource getgumbtekst odgumbaprekoappletadolabele e ivjgumbtekst setactioncommand postavitekst ivjgumbtekst setlabel postavi tekst catch java lang throwable ivjexc handleexception ivjexc return ivjgumbtekst private void initconnections getgumbtekst addactionlistener this private void odgumbaprekoappletadolabele java awt event actionevent arg try gettesktlabela settext tole je tekst catch java lang throwable ivjexc handleexception ivjexc slika primer kode delegacije v javi opis vzorca delegacija delegacija je nacin razsirjanja in ponovne uporabe funkcionalnosti razreda z oblikovanjem novega razreda z dodatno funkcionalnostjo ki uporablja primerek osnovnega razreda za zagotavljanje osnovne funkcionalnosti dedovanje je splosen nacin razsirjanja in uporabe funkcionalnosti razreda delegacija je bolj splosen pristop ki vsebuje klic metode drugega razreda namesto dedovanja metode prav tako je delegacija v nekaterih primerih bolj primeren nacin razsirjanja funkcionalnosti od dedovanja tipicen primer uporabe dedovanja je relacija tipa je is a kind of ker je relacija staticne narave po drugi strani pa je implementacija relacije tipa igra vlogo is a role played by s pomocjo dedovanja precej okorna saj lahko primerki razreda igrajo razlicne vloge ce si pogledamo primer letalskih rezervacij na sliki bomo hitro videli okornost implementacije s pomocjo dedovanja stevilo razredov raste eksponentno s stevilom vlog ki jih posamezen primerek razreda lahko prevzema slika dedovanje kot razsirjanje funkcionalnosti resitev problema je enostavna to je uporaba delegacije kot osnove za razsirjanje funkcionalnosti pri tem pa dovolimo vecjo fleksibilnost zgrajenega sistema enak primer kot prej je prikazan na sliki sedaj s pomocjo uporabe delegacije lepo je vidna poenostavitev modela saj sedaj za novo vlogo osebe ni potrebno vec dodajati vseh moznih kombinacij ampak samo en razred slika letalski sistem s pomocjo delegacije drugi razlog uporabe delegacije je skrivanje metode nadrazreda pred drugimi razredi ne obstaja ucinkovit pristop skrivanja metod ali atributov podedovanih od nadrazreda s pomocjo delegacije pa je povsem enostavno izvedljivo da razred sicer uporablja metode in atribute izvornega razreda jih pa skrije pred drugimi razredi sam razred namrec doloca svoj javni vmesnik preko katerega bodo vsi ostali razredi primerke razreda uporabljali implementacija delegacije je povsem jasna vsebuje pridobivanje reference na objekt razreda komur zelimo delegirati in klice metod tega objekta vzorec vmesnik vzorec in java v jeziku java lahko najdemo ogromno primerov uporabe vzorca vmesnik tako vse kolekcijske razrede uporabljamo preko vmesnika ki je definiran loceno od implementacije to tudi dovoljuje da lahko razlicne implementacije funkcionalnosti vmesnika uporabljamo na enak nacin npr obstajajo kolekcije ki se v kombinaciji z objektno bazo uporabljajo za zagotavljanje trajnosti kolekcije objektov vmesnik do taksne kolekcije pa je enak vmesniku osnovne kolekcije opis vzorca vmesnik doseganje neodvisnosti razreda ki uporablja funkcionalnost in podatke primerov drugih razredov od teh razredov s pomocjo dostopa do teh primerkov preko jasnega vmesnika vmesniki predstavljajo enega osnovnih gradnikov java aplikacij zagotavljajo manjso sklopljenost aplikacijskega programa in s tem poenostavljajo kasnejse vzdrzevanje osnovni pristop k uporabi vmesnikov je prikazan na sliki slika primer uporabe vmesnika uporaba vzorca vmesnik zagotavlja da je razred ki potrebuje doloceno funkcionalnost neodvisen od razreda ki funkcionalnost tudi implementira sticna tocka teh dveh razredov je vmesnik katerega razred uporabnik uporablja razred usluga pa implementira seveda je taksno aplikacijo zaradi novega nivoja tezje razumeti sama implementacija vzorca je precej enostavna definirati je potrebno vmesnik ki zagotavlja doloceno funkcionalnost razviti razrede odjemalce ki dostopijo do funkcionalnosti preko vmesnika in izdelati razrede ki vmesnik implementirajo vzorec nespremenljiv vzorec in java verjetno najpomembnejsi primer uporabe vzorca predstavlja razred string to pomeni da je zaporedje znakov doloceno v casu kreiranja objekta sam vmesnik do razreda string pa ne zagotavlja nobenih metod ki bi omogocale spreminjanje tega zaporedja metode kot sta tolowercase in substring oblikujeta novo zaporedje znakov in ga vrneta kot nov primerek razreda string to lahko v mnogocem pojasni razlicno vedenje primerkov razreda string v primerjavi z obicajnimi objekti primerki razreda string se namrec vedejo v skladu s specifikacijo vzorca nespremenljiv opis vzorca nespremenljiv vzorec nespremenljiv povecuje robustnost objektov ki si delijo skupno referenco na en sam objekt in zmanjsuje kompleksnost hkratnega dostopa do objekta to dosega s prepovedjo spremembe kateregakoli podatka ki doloca stanje objekta potem ko je bil objekt kreiran vzorec odstranjuje tudi potrebo po sinhronizaciji izvajanja vecih niti ki si delijo isti objekt vzorec nespremenljiv je uporaben v razlicnih kontekstih vsi pa imajo skupno to da vsebujejo primerek razreda ki je uporabljen shared v vecih razredih hkrati pa je objekt staticne narave praviloma se ne spreminja jasno je da lahko moznost hkratnega dostopa do objektov v mnogocem otezi razvoj saj se je potrebno zelo previdno izogniti vsem morebitnim tezavam v najslabsi situaciji bo potrebno vsak dostop in spreminjanje stanja objekta sinhronizirati vzorec nespremenljiv pa se tem tezavam izogne saj organizira informacije o stanju objekta na tak nacin da se ne spreminjajo potem ko je objekt oblikovan slika prikazuje enostaven primer razreda lokacija ki uporablja vzorec nespremenljiv opazite lahko da metod za postavljanje pozicije ni obstaja pa metoda zamakni ki kreira nov primerek razreda lokacija vse s smeri da se informacije o stanju objekta ne smejo spremeniti slika primer uporabe vzorca nespremenljiv rezultat uporabe vzorca je da se stanje taksnega objekta nikoli ne spremeni to tudi pomeni da ni potrebno razviti nobene kode ki bi skrbela za hkraten dostop do podatkov iz vecih objektov ali vecih niti poleg tega pa se operacije ki bi obicajno spremenile stanje objekta definirajo tako da vrnejo nov primerek razreda implementacija vzorca ima samo dva osnovna napotka prvi je ta da lahko postavimo vrednosti atributom le med kreiranjem objekta vse ostale metode lahko le berejo podatke in drugi je ta da ce bi metoda morala spremeniti enega izmed podatkov moram namesto tega oblikovati nov primerek razreda obstaja pa se ena variacija tega vzorca namrec objekt ki omogoca samo branje a z znanjem ki ga imamo lahko to za vsak objekt z minimalno truda implementiramo s tem da objavimo v zunanjem vmesniku le tisti del celotnega vmesnika ki sluzi za branje podatkov ostale metode pa pred uporabniskim objektom skrijemo situacija je prikazana na sliki slika alternativa objektu za branje vzorec prototip vzorec in java samega vzorca prototip v osnovni javi ne najdemo zato pa predstavlja ta pristop bistvo komponentnega modela java zrn javabeans javanska zrna so v resnici primerki razredov ki so skladni z nekaterimi imenskimi predpisi prav ti predpisi dovoljujejo da javansko zrno prilagodimo svojim potrebam ko zrno prilagodimo specificnim zahtevam aplikacije ga serializiramo nato ga vedno ko zrno potrebujemo nalozimo v aplikacijo s pomocjo deserializacije ce pa pogledamo na to malce bolj natancno pa predstavlja tak pristop le casovno zamaknjeno kloniranje osnovnega objekta kar je osnovna ideja vzorca prototip opis vzorca prototip vzorec prototip omogoca objektom kreiranje prilagojenih objektov brez poznavanja njihovega natancnega razreda ali postopka kreiranja deluje na principu posredovanja prototipnega objekta dolocenemu objektu ki inicira kreiranje objekta ali mnozice objektov iniciator kreiranja naknadno kreira nove primerke na podlagi prototipnega objekta s tem da kreira njegove kopije klone image gif bytes slika primer vzorca prototip osnovna znacilnost tega vzorca je metoda kloniraj ki na podlagi prototipnega objekta kreira zahtevane primerke slika prikazuje taksno situacijo kjer smo poleg samega vzorca uporabili se dedovanje ki zagotavlja enak vmesnik za katerega koli izmed zahtevanih realnih objektov to tudi pomeni da je mogoce ob taki arhitekturi zelo enostavno dodajati nove razrede pod pogojem da implementirajo metodo kloniraj potrebno pa se je zavedati da se taksno kreiranje objektov razlikuje od obicajnega saj imamo nekje pripravljeno sablono s pomocjo katere bomo kreirali nove objekte a ti objekti se vedno zadoscajo vseh lastnostim kot so identiteta stanje in reakcije na sporocila vzorec iterator vzorec in java vzorec iterator najdemo v javi na vec mestih verjetno najbolj vidna je uporaba iteratorjev na nivoju razredov kolekcij razredov v paketu java util kjer vmesnik collection igra vlogo vmesnika do implementacije kolekcije ki zna oblikovati iteratorje za prehod nad objekti ki jih vsebuje opis vzorca iterator vzorec iterator definira vmesnik ki doloca metode zaporednega dostopa do objektov v poljubni kolekciji razred ki dostopa do objektov v kolekciji s pomocjo taksnega vmesnika je neodvisen od razreda ki vmesnik implementira to seveda pomeni manjso sklopljenost razredov in manjsi trud v primeru zamenjave implementacije kolekcije osnovno vodilo vzorca je zagotavljanje neodvisnosti razreda uporabnika kolekcije od dejanske implementacije kolekcije razredni diagram vzorca je narisan na sliki kjer lahko vidimo tudi kombinacijo uporabe vzorca vmesnik le ta zagotavlja neodvisnost uporabnika od implementacije slika primer vzorec iterator na sliki pa je viden tudi postopek pridobivanja iteratorja kjer sama implementacija kolekcije poskrbi za izbiro pravilne implementacije iteratorja seveda uporabniski objekti do obeh implementacij dostopajo le preko jasno definiranega javnega vmesnika to pomeni da lahko v uporabniskih objektih dostopamo do objektov brez da bi poznali implementacijo hkrati pristop k taksni implementaciji dostopa do objektov zagotavlja enostavno implementacijo sistema kjer imam vec hkratnih prehodov nad objekti kolekcije pri tem pa lahko nad isto kolekcijo ustvarimo razlicne prehode s tem da kreiramo razlicne vrste iteratorjev vzorec abstraktna tovarna vzorec in java vzorec abstraktna tovarna je uporabljen v jeziku java z implementacijo razreda java awt toolkit vemo da je to razred ki je odgovoren za kreiranje objektov ki delujejo z okenskim okoljem ker je java neodvisna od okolja to pomeni da moramo nekako kreirati primerke pravilne implementacije razredov za to je zadolzena t i konkretna tovarna ta poskrbi da se na podlagi nekaksne inicializacije ali parametrov kreirajo ustrezni primerki razredov kot zanimivost povejmo da se vzorec abstraktna tovarna najveckrat pojavlja v povezavi z vzorcem edinec ki zagotavlja eno samo instanc objektov ki je so hkrati v pomnilniku to je v skladu z osnovnim opisom rabimo namrec samo en objekt ki bo skrbel za taksno kreiranje ob vecih objektih bi bilo potrebno kreiranje sinhronizirati in skrbeti za medsebojno komunikacijo med objekti konkretnimi tovarnami opis vzorca abstraktna tovarna abstraktna tovarna je vzorec ki zagotavlja kreiranje pravilne mnozice konkretnih razredov na podlagi povezanih abstraktnih razredov podanih kot parameter abstraktna tovarna predstavlja vzorec ki lahko v mnogocem poenostavi razvoj uporabniskih aplikacij ki delujejo z mnozico kompleksnih zunanjih entitet npr razlicni okenski sistemi razlicni komunikacijski kanali slika prikazuje tipicno shemo vzorca abstraktna tovarna vidimo lahko kako s pomocjo vmesnikov zelo enostavno zagotovimo neodvisnost od implementacije hkrati pa je na sliki vidna moznost kreiranja ustreznih podrazredov glede na vrednosti parametrov v metodo ki je odgovorna za kreiranje objektov image gif bytes slika vzorec abstraktna tovarna vzorec mvc vzorec in java swing kot del jfc je knjiznica za izgradnjo okenskih graficnih vmesnikov je torej nabor graficnih okenskih komponent podobno kot awt je pa delo s swing komponentami do neke mere razlicno od dela z obicjanimi komponentami to je posledica uporabe vzorca mvc model view controller to pomeni da je vsaka komponenta sestavljena iz treh delov modela pogleda in upravljalca kjer sta izgled in upravljalec zaradi mocne soodvisnosti obicajno zdruzena v en objekt poglejmo to na primeru gumba model gumba sestavlja nekaj spremenljivk string name boolean pressed izgled je pravokotnik z napisom v sredini upravljalec pa je skupek funkcij ki sledijo klikom miske in skrbijo za ustrezen izgled neodvisno od modela ter izgleda uporabnost takega pristopa se pokaze v primeru ko je potrebno modelu zamenjati izgled ali izgledu zamenjati model image gif bytes slika model mvc vzorec in java bistvo vzorca mvc je prikazana na sliki image gif bytes slika model mvc in swing komponente kot lahko vidimo je osnovni namen locitev podatkov od njihovega prikaza pristop je bil najprej vpeljan v jeziku smalltalk danes model mvc zelo pogosto srecamo v praksi kjer je obicajno razred upravljalec tesno povezan oz vkljucen v razred za prikaz izgled na ta nacin upravljalec je notranji inner razred v prikazu je model uporabljen tudi v sklopu jave in swing komponent to je prikazano na sliki zakljucek v prispevku smo pokazali da objektni jezik kot java je vsebuje celo vrsto visokonivojskih konstruktov s katerimi lahko precej poenostavimo razvoj novih sistemov jasno je da vsak objekten programski jezik knjiznica razredov ali ogrodje vsebuje celo vrsto vzorcev pomembno pa je da se ti vzorci identificirajo in jasno dokumentirajo izkusnje kazejo da dokumentacija s pomocjo vzorcev dopolnjuje osnovno dokumentacijo in je razvijalcem v veliko pomoc tega se pricenjajo zavedati tudi nekateri proizvajalci objektnih ogrodij in razvojnih okolij pri njih namrec pomemben del dokumentacije nastopa dokumentacija s pomocjo vzorcev kot je bilo povedano ze na zacetku so prav izkusnje tiste ki locijo dobrega od odlicnega razvijalca in vzorci s svojim opisom predstavljajo element ki lahko zapolni manjkajoco vrzel na poti do izkusenosti pa ceprav jih najveckrat uporabljamo ne da bi se tega zavedali ali pa kljub temu literatura c alexander et al a pattern language new york oxford university press e gamma r helm r johnson j vlissides design patterns elements of reusable object oriented software reading addison wesley j martin principles of object oriented analysis and design prentice hall j o coplien generative pattern languages an emerging direction of software design proceedings of the th annual borland international conference m fowler analisys patterns reusable object models addison wesley m grand patterns in java volume wiley p coad object models strategies patterns applications yourdon press r prins developing bussines objects a framework driven approach mcgraw hill t domajnko vzorci in ponovna uporaba izkusenj uporabna informatika st m hericko a zivkovic s beloglavec i rozman osnove programiranja v javi zbrano gradivo maj vase mnenje o prispevku splosno odlicen vreden branja ni vreden branja dolzina predolg ravno prav prekratek strokovnost prevec strokoven ravno prav prevec splosen opombe vase ime priimek e posta podjetje