Metodologija razvoja softvera Dizajnerski abloni Design Patterns Lekcija
Metodologija razvoja softvera Dizajnerski šabloni- Design Patterns Lekcija. 02 Kreacioni šabloni Prof. dr Branko Perišić, bperisic@singidunum. ac. rs
Osnovi DŠi. SK – Šabloni 1 Obuhvat Klasa Objekat NAMENA Kreacioni Strukturalni Šabloni ponašanja Factory Method Adapter Interpreter Abstract Factory Adapter Chain of Responsibility Builder Bridge Command Prototype Composite Iterator Singletone Decorator Mediator Facade Memento Flyweight Observer Proxy State Strategy Visitor
Osnovi DŠi. SK – Factory Method Obuhvat Klasa NAMENA Kreacioni Strukturalni Šabloni ponašanja Factory Method Adapter Interpreter Abstract Factory Chain of Factory Method Adapter – Proizvodni metod Responsibility Problem koji rešava: rešava Builder Bridge Command Composite Iterator Dinamičko Prototype (dekuplovano) kreiranje uz oslonac na Mediator mehanizam. Singletone nasleđivanja!Decorator Facade Poznat kao: kao Virtualni konstruktor. Objekat Flyweight Namena: Namena Proxy Memento Observer State Strategy Definiše interfejs za kreiranje nekog objekta ali podklasi prepušta odluku o tome koju klasu Visitor će instancirati! (Dopušta da nadklasa prepusti instanciranje podklasi!)
Proizvodni metod - Motivacija: • Situacija 1. : 1. Želimo komunicirati sa instancom neke klase (pozivom njene metode) a jedino posedujemo svest o interfejsu ili o samoj roditeljskoj klasi. • Situacija 2. : Želimo lokalizovati 2. instanciranje objekata neke klase u cilju bolje kontrole koda.
Proizvodni metod - Motivacija:
Proizvodni metod - Primenljivost: • Neophodno je primeniti ovaj šablon u situacijama kada: – klasa KREATOR ne može da zna KLASU OBJEKTA koji treba da instancira; – nadklasa želi da njene podklase odluče koje objekte je potrebno instancirati; – kada klase delegiraju odgovornost jednoj od više pomoćnih podklasa uz LOKALIZACIJU znanja o tome koja konkretna podklasa je DELEGAT;
Proizvodni metod - Struktura:
Proizvodni metod - Učesnici: • Proizvod: – deklariše interfejs objekta koji pravi proizvodni metod. • Konkretan. Proizvod: – implementira interfejs Proizvod. • Proizvođač: – deklariše proizvodni metod (konstruktor) koji vraća objekat tipa Proizvod. Može da definiše i podrazumevanu implementaciju konstruktiora koji vraća objekat podrazumevane klase Konkretan. Proizvod. – može da pozove konstruktor objekta tipa Proizvod • Konkretan. Proizvođač: – nadjačava konstruktor Proizvođača i vraća instancu Konkretnog. Proizvoda.
Proizvodni metod - Saradnja: • Proizvođač računa na to da će njegove podklase definisati proizvodnu metodu (konstruktor) u cilju vraćanja instance odgovarajućeg Konkretnog. Proizvoda.
Proizvodni metod - Posledice: • Eliminiše potrebu da se u kod ugrade klase specifične za pojedine aplikacije. • Kod radi samo sa INTERFEJSOM Proizvod, pa zbog toga može da radi sa bilo kojom korisnički definisanom klasom Konkretan. Proizvod, koja implementira interfesj Proizvod. • Potencijalna mana: - klijenti moraju kreirati podklase Proizvođač samo da bi napravili objekat klase Konkretan. Proizvod. • Obezbeđuje sredstvo za potklase: Pravljenje objekata unutar klase pomoću proizvodne metode je fleksibilnije od neposrednog pravljanja objekata. Proizvodni metod daje podklasama sredstvo za obezbeđenje proširene verzije objekta. • Povezuje paralelne hijerarhije klasa:
Proizvodni metod – Primer 1. :
Proizvodni metod – Aspekti Implementacije: 1. Dve osnovne varijante + jedna izvedena: 1. Proizvođač – APSTRAKTNA KLASA koja ne pruža implementaciju proizvodnog metoda koji deklariše. 2. Proizvođač – KONKRETNA KLASA koja pruža podrazumevanu (default) implementaciju deklarisanog proizvodnog metoda. 3. Proizvođač – APSTRAKTNA KLASA koja pruža podrazumevanu (default) implementaciju proizvodnog metoda koji deklariše.
Proizvodni metod – Aspekti Implementacije: 2. Parametrizovani proizvodni metodi: v omogućava da deklarisani proizvodni metod kreira više vrsta proizvoda zavisno od vrednosti prosleđenog parametra. (konstruktor sa parametrima) 3. Specifičnosti programskih jezika: Ø Smalltalk – najčešće se koristi proizvodni metod koji vraća KLASU objekta koji treba instancirati! Ø C++ - proizvodni metod je uvek virtuelna funkcija i obično se realizuje uz oslonac na tzv. odloženu (leaned) inicijalizaciju (konstruktor inicijalizuje a proizvodna metoda kreira proizvod ako ne postoji. ) Ø JAVA?
Proizvodni metod – prednosti i mane Prednosti Factory Method – obrasca: Instanciranje konkretnih objekata je lokalizovano Programski kod nije jako spregnut sa tipom konkretnih instanci Klasa može delegirati kreiranje konkretnih objekata koje koristi na svoje podklase čime se postiže veća fleksibilnost. U slučajevima paralelnih hijerarhija možemo lokalizovati znanje o tome koje klase su u vezi Mane Factory Method – obrasca: S obzirom da je ovaj dizajn obrazac najčešće baziran na nasleđivanju dolazi do pojave relativno velikog broja klasa Svaki novi proizvod zahteva novog Kreatora.
Proizvodni metod - Primer Klijent (klasa Client) Koristi Proizvod (Interfejs Product) putem pozivanja njegovih metoda. Kreator (klasa Creator) Najčešće apstraktna klasa mada može biti i interfejs koji poseduje metodu za kreiranje objekata. Metoda za kreiranje objekata može imati implementaciju ili može biti apstraktna. Konkretan kreator (klase Concrete. Creator. . . ) Klasa koja nasleđuje kreatora i redefiniše metodu za kreiranje objekata. Proizvod (klasa Product) Klasa/objekat definisan interfejsom sa kojim Klijent komunicira. Konkretni proizvodi (klase Concrete. Product. . . ) Klase/objekti koji ispunjavaju ugovor (implementiraju interfejs) koji definiše Proizvod.
Proizvodni metod –Java kod package dsisk. patterns. creational. factory; public class Factory. Method. Test { public static void main(String[] args) { Creator[] creators = new Creator[2]; creators[0] = new Concrete. Creator. A(); creators[1] = new Concrete. Creator. B(); System. out. println("Created Products: "); for(Creator creator: creators) { Product product = creator. factory. Method(); System. out. println(product. who()); } } }
Proizvodni metod –Java kod public abstract class Creator { public abstract Product factory. Method(); } public class Concrete. Creator. A extends Creator { @Override public Product factory. Method() { return new Concrete. Product. A(); } }
Proizvodni metod –Java kod public class Concrete. Creator. B extends Creator { @Override public Product factory. Method() { return new Concrete. Product. B(); } } public interface Product { public String who(); }
Proizvodni metod –Java kod public class Concrete. Product. A implements Product { @Override public String who() { return "Concrete Product A. "; } } public class Concrete. Product. B implements Product { @Override public String who() { return "Concrete Product B. "; } }
Proizvodni metod – Srodni šabloni: • Abstract Factory – često se implementira uz oslonac na obrazac – Proizvodni metod. • Template Method – Proizvodni metodi se obično pozivaju iz Template Method (Šablonski metod) obrasca. • Prototip – Koristi Proizvodni metod u sklopu inicijalizacije u okviru klase Proizvođač.
Proizvodni metod – Primeri:
Proizvodni metod – Java Primer:
Proizvodni metod – Java Primer:
Proizvodni metod – Java Primer:
Proizvodni metod – Srodni šabloni:
Proizvodni metod – Primeri: Use the Factory Method when you don’t know beforehand the exact types and dependencies of the objects your code should work with. The Factory Method separates product construction code from the code that actually uses the product. Therefore it’s easier to extend the product construction code independently from the rest of the code. For example, to add a new product type to the app, you’ll only need to create a new creator subclass and override the factory method in it.
Proizvodni metod – Dobre osobine You avoid tight coupling between the creator and the concrete products. Single Responsibility Principle. You can move the product creation code into one place in the program, making the code easier to support. Open/Closed Principle. You can introduce new types of products into the program without breaking existing client code.
Proizvodni metod – Problemi The code may become more complicated since you need to introduce a lot of new subclasses to implement the pattern. The best case scenario is when you’re introducing the pattern into an existing hierarchy of creator classes.
Proizvodni metod – primeri You often experience this need when dealing with large, resource-intensive objects such as database connections, file systems, and network resources. First, you need to create some storage to keep track of all of the created objects. When someone requests an object, the program should look for a free object inside that pool. … and then return it to the client code. If there are no free objects, the program should create a new one (and add it to the pool). That’s a lot of code! And it must all be put into a single place so that you don’t pollute the program with duplicate code. Probably the most obvious and convenient place where this code could be placed is the constructor of the class whose objects we’re trying to reuse. However, a constructor must always return new objects by definition. It can’t return existing instances. Therefore, you need to have a regular method capable of creating new objects as well as reusing existing ones. That sounds very much like a factory method.
Apstraktna fabrika – Abstract Factory Obuhvat Klasa NAMENA Kreacioni Strukturalni Šabloni ponašanja Factory Method Adapter Interpreter Abstract Factory Adapter Chain of Responsibility Predstavlja generalizaciju obrasca Bridge Command Factory Method Builder Prototype Composite Singletone Objekat Decorator Problem Iterator Mediator koji rešava: Facade Memento Proxy State Više "platformi", jedan interfejs za Flyweightfamilije proizvoda! Observer kreiranje Strategy Klijent (objekat koji ih koristi) ne mora da Visitor zna konkretne implementacije.
Abstract Factory: Problem 1. 1. Pretpostavite alat za generisanje korisničkog interfejsa koji treba da podržava više “look-andfeel” standarda. 2. Zbog prenosivosti aplikacije informacije o primenjenom standardu nesmeju “hardkodirati” hardkodirati u sklopu grafičkih elemenata. se Kako dizajnirati aplikaciju tako da uključivanje novog standarda bude jednostavno?
Abstract Factory : Rešenje[1] 1. Definišite apstraktnu klasu grafičkog elementa Widget. Factory 2. Ova klasa deklariše interfejs koji omogučava kreiranje različitih vrsta grafičkih elemenata. 3. Postoji apstraktna klasa za svaki tip grafičkog elementa i konkretne podklase koja implementiraju grafičke elemente za različite standarde prikaza. Widget. Factory poseduje metode koja vraćaju novi grafički element za svaku apstraktnu klasu. Klijent poziva ove metode u cilju instanciranja grafičkog elementa bez svesti o konkretnim klasama koje ga implementiraju. 4.
Abstract Factory: Rešenje[2] Client Widget. Factory Window Create. Scrollbar() Create. Window() Mac. Window WWidget. Factory WWindow Scroll. Bar Mac. Widget. Factory Mac. Scroll. Bar Jedan za svaki standard. WScroll. Bar
Apstraktna fabrika - Motivacija:
Abstract Factory: Rešenje[3] Abstract. Factory Client Abstract. Product. A Create. Scrollbar() Create. Window() Product. A 2 Concrete. Factory 1 Product. A 1 Abstract. Product. B Concrete. Factory 2 Create. Product. A() Create. Product. B() Product. B 2 Product. B 1
Apstraktna fabrika – primer upotrebe • Pretpostavimo da je neophodno implementirati radni okvir koji omogućava podršku izvršavanju niza sličnih komandi. • Korisnici radnog okvira moraju imati mogućnost da implementiraju vlastite komande. • Kako klijenti mogu instancirati vlastite implementacije pojedinačnih komandi? • Posmatrajmo model:
Apstraktna fabrika – primer upotrebe
Apstraktna fabrika – primer upotrebe
Apstraktna fabrike – primer koda
Apstraktna fabrike – primer koda
Apstraktna fabrika Struktura Proizvod (klasa Product) Klasa/objekat definisan interfejsom sa kojim Klijent komunicira. Konkretni proizvodi (klase Concrete. Product. . . ) Klase/objekti koji ispunjavaju ugovor (implementiraju interfejs) koji definiše Proizvod. Kreator (klasa Creator) Najčešće apstraktna klasa mada Klijent (klasa Client) može biti i interfejs koji poseduje metode za kreiranje Koristi Proizvode objekata. (Interfejsi Product. . . ) Metode za kreiranje objekata putem pozivanja njihovih metoda. mogu imati implementaciju ili Konkretan kreator (klase mogu biti apstraktne. Concrete. Creator. . . ) Klasa koja nasleđuje kreatora i redefiniše metodu za kreiranje objekata.
Apstraktna fabrika – prednosti i mane Šta dobijamo upotrebom ovog obrasca? • Instanciranje familije konkretnih objekata je lokalizovano. Programski kod nije jako spregnut sa tipom konkretnih instanci • Promena familije konkretnih instanci je moguća izmenom programskog koda na mestu gde se instancira konkretna fabrika objekata (najčešće jedna linija koda). • U određenim slučajevima moguća je dinamička promena fabrike objekata (npr. Swing PLAF). A šta gubimo? • S obzirom da je ovaj dizajn obrazac najčešće baziran na nasleđivanju dolazi do pojave relativno velikog broja klasa Svaki novi proizvod zahteva novog Kreatora i svaka nova familija proizvoda zahteva novu fabriku i nove konkretne proizvode.
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel
SWING – Pluggable Look and Feel How to Implement Ø Map out a matrix of distinct product types versus variants of these products. Ø Declare abstract product interfaces for all product types. Then make all concrete product classes implement these interfaces. Ø Declare the abstract factory interface with a set of creation methods for all abstract products. Ø Implement a set of concrete factory classes, one for each product variant. Ø Create factory initialization code somewhere in the app. It should instantiate one of the concrete factory classes, depending on the application configuration or the current environment. Pass this factory object to all classes that construct products. Ø Scan through the code and find all direct calls to product constructors. Replace them with calls to the appropriate creation method on the factory object.
Graditelj - Builder Obuhvat NAMENA Kreacioni Klasa Strukturalni Factory Method Abstract Factory Builder Prototype Singletone Builder Adapter – kreacioni šablon Interpreter Chain of Problem koji rešava: Responsibility Bridge složenog. Command Parsiranje modela ili opisa i Compositejednog od Iterator kreiranje više mogućih Decorator Mediator ciljnih objekata! Facade Objekat Šabloni ponašanja Memento Razdvaja konstrukciju složenih objekata Flyweight od njihovog modela (Observer pretstave) pretstave tako da isti proces može da kreira Proxykonstrukcije State različite reprezentacije Strategy Visitor Kreiranje se obavlja korak po korak!
Graditelj – Motivacija Factory Pattern - vraća jednu od više različitih podklasa zavisno od vrednosti argumenta koja je prosleđene proizvodnom metodu. Šta se dešava ako želimo ne samo različit način izračunavanja već potpuno različit KORISNIČKI INTERFEJS u funkciji podataka koje želimo prikazivati? Primer: Prikazivanje sadržaja E-mail adresara. Adresar obično sadrži pojedince i grupe pri čemu prikaz sadržaja zavisi od toga da li se prikazuju pojedinci ili grupe! Npr: kada se prikazuju pojedinci neopodno je prikazati: prezime i ime, preduzeće u kome je zaposlen, adresu stanovanja, broj telefona, e-mail adresu i sl. Ako se prikazuje grupa neophodno je prikazati: naziv grupe, njenu svrhu, spisak članova sa e-mail adresama.
Graditelj – Motivacija
Graditelj – Motivacija Zahteve nije moguće ispuniti uz oslonac na Factory šablon, jer se ne vraćaju objekti koji su jednostavni sledbenici osnovnog objekta već POTPUNO DRUGAČIJI i komponovani od više različitih kombinacija osnovnih objekata! Graditelj (Builder Pattern) asemblira više objekata na različite načine zavisno od podataka Obezbeđuje potpuno razdvajanje PODATAKA od NAČINA PRIKAZIVANJA. (Tipično za JAVA – programski jezik)
Graditelj - Struktura: Usmeravač (klasa Director) Klasa koja izdaje zahteve za izgradnju delova složenog objekta. Graditelj (klasa Builder) Apstraktna klasa (ili interfejs) koja definiše operacije za kreiranje delova proizvoda kao i operaciju koja vraća izgrađen proizvod. Konkretni Graditelj (Concrete. Builder. . . ) Klase koje definišu metode izgradnje delova konkretnih proizvoda.
Graditelj – Saradnja Klijent Usmerivač Konkretni. Graditelj new Usmerivač(Konkretni. Graditelj) Izgradi() Izgradi. Deo. A() Izgradi. Deo. B() Izgradi. Deo. C() Vrati. Rezultat()
Graditelj - Posledice: • Omogućava menjanje unutrašnje pretstave proizvoda. – Objekat Graditelj daje Usmerivaču apstraktan interfejs za konstruisanje proizvoda. – Interfejs dozvoljava graditelju da skriva pretstavu i unutrašnju strukturu proizvoda kao i način njegove izgradnje. – Da bi se promenila pretstava proizvoda neophodno je jedino definisati NOVI GRADITELJ. • Razdvaja kod za PRETSTAVLJANJE. IZGRADNJU od koda za – Klijent ne mora ništa da zna o klasama koje omogućavaju izgradnju. – Svaki konkretan graditelj sadrži sav potreban kod za izgradnju određene vrste proizvoda • Omogućava finiju kontrolu procesa izgradnje. – Proizvod se gradi KORAK pod kontrolom Usmerivača. – Usmerivač preuzima proizvod od graditelja tek kada je on u potpunosti izgrađen.
Graditelj – Srodni šabloni: • Abstract Factory – slična je Graditelju po tome što može da gradi složene objekte sa tom razlikom što Graditelj gradi objekat korak po korak i vraća ga na kraju, a apstraktna fabrika ga vraća odmah jer poseduje SVE VARIJANTE i gradi proizvod ODJEDNOM! • Composite – Graditelj se često koristi u sklopu šablona Composite (Sastav)
Builder (Ne softverski primer) Razdvaja proces konstrukcije kompleksnih objakata of njihove predstave tako da isti proces konstrukcije može rezultirati različitim proizvodima.
Builder (Softverski primer) Compiler process: Lexical analysis Syntax analysis Semanti c analysis Intermediate code Interpretation Java Compiler: Java Lexer Java Parser Semantic analysis Java byte code JVM Semantic analysis Python byte code PVM Python Compiler: Python Lexer Python Parser
Prototip – Šablon Prototype – kreacioni šablon Obuhvat NAMENA ProblemŠabloni koji rešava: Strukturalni ponašanja Kreacioni Klasa Factory Method Adapter Specificira vrste Interpreter objekata koje je Abstract Factory Adapter Chain of potrebno kreirati uz oslonac na Responsibility instancu-prototip, i Command kreira novi objekat Builder Bridge kopiranjem prototipa! prototipa Prototype Composite Iterator Singleton Objekat Decorator Mediator Facade spada u. Memento • Prototip objekt-kreacione šablone. Flyweight Observer • Instanciranje se obično delegira drugom Proxy State objektu! Strategy Visitor
Prototip -Motivacija: • Koristi se da bi izbegli kreiranje više podklasa u cilju instanciranja više vrsta istog objekta. • Klijent jedino treba da bude u interakciji sa osnovnim Prototipom koji onda utvrđuje vrstu i poziva operaciju kloniranja konkretnog prototipa.
Prototip - Primena: • Kada sistem treba biti nezavistan od načina kreiranja, komponovanja i predstavljanja svojih produkata i – Kada se instance specificiraju u trenutku izvršavanja (run-time). ILI – Da bi se izbegla izgradnja hijerarhije klasakreatora (factories) ILI – Kada instance klase mogu imati jednu, od malog broja različitih, kombinacija stanja. • Može biti jednostavnije instancirati potreban broj prototipova i klonirati ih nego ručno instancirati klase svaki put kada se nalazimo u odgovarajućem stanju!
Prototip- Struktura:
Prototip - Učesnici: • Prototype – deklariše interfejs za vlastito kloniranje. • Concrete. Prototype – implementira operaciju vlastitog kloniranja. • Client – kreira novi objekat tražeći od prototipa da se klonira! • Svi klijenti traže da se prototip klonira.
Prototip - Posledice: • +Prototip skriva konkretne klase koje generišu proizvod. – Smanjuje se domen imena koje klijent mora poznavati • +Dozvoljava klijentu da se skoncentriše na razvoj klasa koje su specifične za razvijanu aplikaciju bez rizika da ih kasnije mora menjati. • +Dodavanje i uklanjanje produkata u fazi izvršavanja (runtime). – novi konkretni proizvodi posretstvom registracije prototipa • Specifikacija novih objekata izmenom vrednosti. – definisanje novog ponašanja komponovanjem objekata specifikacijom vrednosti varijabli objekta umesto definisanjem novih klasa • Specifikacija novih objekata variranjem strukture. – izgradnja objekata od delova i elemenata • Smanjenje broja podklasa. – kloniranje prototipa umesto kreiranja novog objekta • Dinamičko konfigurisanje aplikacije bazirane na klasama – neka izvršna okruženja dozvoljavaju dinamičko punjenje klasa. – Prototype šablon je nezaobilazan kod statičkih jezika kao što je C++.
Prototip - Odgovornost • Svaka podklasa mora implementirati Clone() operaciju što nije uvek jednostavno! – kada klasa već postoji to je jako teško • možda ne podržava kopiranje! • mogućnost nastanka kružnog referenciranja!
Prototip - Srodni šabloni: • Abstract Factory • Factory Method • Projekti koji intenzivno koriste: Composite i Decorator šablone mogu dobiti na efikasnosti upotrebom Prototype šablona.
Unikat – Singletone Šablon Obuhvat Klasa NAMENA Kreacioni Strukturalni Šabloni ponašanja Factory Method Adapter Interpreter Abstract Factory Adapter Singleton – Builder Bridge Prototype Composite Singletone Objekat Chain of Responsibility kreacioni šablon Command Problem koji rešava: Iterator Decorator da klasa Mediator Obezbediti poseduje jednu i Facade Memento samo jednu instancu i pruža globalno dostupnu koje se toj Flyweight tačku preko Observer instanci može pristupiti. Proxy State Strategy Visitor
Unikat - Motivacija: • Za neke klase je važno da poseduju samo jednu instancu. Mada u sistemu može da bude više štampača neophodno je postojanje SAMO JEDNOG servisa odložene štampe (SPOOL). • U sklopu operativnog sistema nužno je postojanje samo jedne instance: SISTEMA DATOTEKA ili TASK-MENADŽERA. • GLOBALNE PROMENLJIVE? • Bolje da se SAMA KLASA brine o svom jedinom OBJEKTU. – Singletone!
Unikat - Struktura:
Unikat - Posledice: • Kontrolisani pristup jednom primerku: – Pošto klasa unikat enkapsulira svoj jedini primerak ona ima STROGU KONTROLU na koji način mu Klijenti pristupaju! • Smanjenje prostora imena: – Izbegava zagađenje prostora imena programa imenima GLOBALNIH PROMENLJIVIH koje čuvaju jedine primerke. • Omogućava predstavljanja: unapređenje operacija i – Klasa unikat može da poseduje PODKLASE, a aplikacija se jednostavno konfiguriše primerkom PROŠIRENE KLASE. • Dozvoljava promenu broja primeraka: – Ako se želi odustati od jednog primerka neophodno je jedino promeniti operacije koje pristupaju primerku unikata. • Fleksibilniji od operacija klase: – U slučaju C++ operacije klase stvaraju problem!
Unikat - Implementacija: class Print. Spooler { //this is a prototype for a printer-spooler class //such that only one instance can ever exist static boolean instance_flag=false; //true if 1 instance public Print. Spooler() throws Singleton. Exception { if (instance_flag) throw new Singleton. Exception("Only one spooler allowed"); else instance_flag = true; //set flag for 1 instance System. out. println("spooler opened"); } //---------------------public void finalize() { instance_flag = false; //clear if destroyed } }
Unikat - Implementacija: public class single. Spooler { static public void main(String argv[]) { Print. Spooler pr 1, pr 2; //open one spooler--this should always work System. out. println("Opening one spooler"); try{ pr 1 = new Print. Spooler(); } catch (Singleton. Exception e) {System. out. println(e. get. Message()); } //try to open another spooler --should fail System. out. println("Opening two spoolers"); try{ pr 2 = new Print. Spooler(); } catch (Singleton. Exception e) {System. out. println(e. get. Message()); } } }
Unikat - Implementacija:
Unikat - Implementacija:
Unikat - Implementacija:
Unikat - Implementacija:
Unikat – Srodni šabloni: • Mnogi drugi šabloni se mogu implementirati uz oslonac na Unikat. • Apstraktna Fabrika • Graditelj • Prototip
Unikat – Diskusija i komentari: • Unikat obezbeđuje jedinstvenu pristupnu tačku servisa. Potencijalni problemi: Ø Skrivene zavisnosti (Coupling) potencijalno bilo gde u kodu! Ø Veze nisu vidljive analizom interfejsa klasa koje koriste Unikat! • Unikat obezbeđuje objekata. ograničenje Ø Jedna klasa preuzima dve odgovornosti: § KREIRANJE OBJEKTA § KORIŠĆENJE OBJEKTA kreiranja
Unikat – Diskusija i komentari: • Unikat promoviše jaku Potencijalni problemi: zavisnost klasa. Ø Testiranje? Singletone objekat sprečava polimorfnu zamenu jednostavnijim objektom (mook objects). objects Ø Bolje rešenje je delegirenje kreiranja objekta jednostavnoj Fabrici ili korišćenje radnih okvira npr. SPRING. • Unikat nosi stanje! (Problem pri testiranju) Ø Objekat unikat se kreira pre nego što ga prva test klasa može koristiti. Ø Isti objekat se ponovno koristi u svim testovima tako da konzervira stanje.
Rekapitulacija kreacionih šablona Ako treba da: Koristimo? • sistem ne poseduje svest o tipu komponente koju kreira • sistem bude otvoren za proširenja ali zatvoren za modifikacije Factory Method • projektovano rešenje bude nezavisno od platforme! • sistem bude nezavistan od načina kreiranja, sklapanja i pretstavljanja njegovih sastavnih delova. • sistem bude konfigurisan sa jednom od više mogućih familija proizvoda. • za familiju proizvoda, dizajniranih tako da se mogu zajedno koristiti, obezbedimo prinudu koja između njih ustanovljava veze i ograničenja. • implementiramo više varijanti nečega a želimo izbeći "case" iskaz čije održavanje obično predstavlja “nočnu moru”! moru Abstract Factory
Rekapitulacija kreacionih šablona Ako treba da: • algoritam za kreiranje složenih sistema bude nezavisan od delova koji ulaze u sastav njegovih podsistema kao i od načina na koji su ti delovi povezani! • proces kreiranja složenih sistema podržava različite načine predstavljanja (reprezentacije)! • se prisutni overhed, koji može nastati prilikom kreiranja neke komponente, lokalizuje i minimizira. Umesto da se kreira potpuno nova instanca dizajnira se “prototipska instanca” koja klonira samu sebe! • se odluka o tipu komponente koju je potrebno kreirati odgodi do faze izvršenja (run-time) • bude kreirana samo jedna instanca sistema a podsistemi su odgovorni da to poštuju i obezbede! • jedna instanca bude globalno dostupna! • jedna instanca bude inicijalizovana jedino i kada joj se pristupi! Koristimo? Builder Prototype Singletone
Metodologija razvoja softvera Dizajnerski šabloni - Design Patterns Lekcija: 03. Kreacioni šabloni
- Slides: 84