2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton
Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et. al. 2
IX.1 Johdanto luontimalleihin Kuvaavat epäsuoria tapoja luoda olioita ohjelmassa Tehdään järjestelmä riippumattomaksi siitä, miten sen oliot luodaan, esitetään ja yhdistellään Luokkamallit perustuvat periytymiseen Oliomallit delegoivat olion luomisen toisille olioille Tarvitaan erityisesti, kun ohjelmassa siirrytään käyttämään koosteolioita periytymisen asemasta Saattaa johtaa mutkikkaampaan olioiden luomiseen Suunnittelumallit Proxy et. al. 3
IX.2 Proxy (Edustaja) Rakennemalli Oliolla on edustajaolio, jota käytetään varsinaisen olion asemasta Proxyn rajapinta on sama kuin varsinaisen kohdeolion Proxy delegoi pyynnöt kohdeoliolle sisältämänsä viitteen kautta Toimii siis asiakasolion ja kohdeolion välissä Esimerkki: Dokumentissa suuri elementti, joka halutaan luoda vasta tarvittaessa Dokumenttiin edustajaksi proxy, joka luo olion vasta näytettäessä Suunnittelumallit Proxy et. al. 4
IX.2.1 Käyttötapoja Kaikki tapaukset, joissa olioon viitataan muuten kuin tavallisen suoran viitteen kautta. Virtuaaliedustaja (Virtual Proxy) Luo paljon resursseja vaativia olioita tarvittaessa Etäedustaja (Remote Proxy) Viitataan olioon, joka sijaitsee toisessa muistialueessa Suojausedustaja (Protection Proxy) Kontrolloi pääsyä olioon. Voi toteuttaa erilaisia pääsyoikeuksia Suunnittelumallit Proxy et. al. 5
IX.2.1 Käyttötapoja (2) Cache Proxy Tilapäinen varasto paljon resursseja vaativan operaation tuloksista, mahdollisesti useiden olioiden käyttöön Synkronointiedustaja (Synchronization Proxy) Rinnakkaisuuden hallinta tilanteessa, jossa kohdeolion toiminta ei ole synkronisoitu asiakasolion kanssa. Smart reference Proxy (älykäs osoitin) Viite, johon toteutettu muitakin toimintoja kuin pelkkä olioon viittaaminen Suunnittelumallit Proxy et. al. 6
IX.2.2 Luokka- ja oliokaavio Määrittelee todellisen kohteen ja Proxyn yhteisen rajapinnan Todellinen kohde Todellisen kohteen edustaja Proxy-mallin luokka- ja oliorakenne. Vrt. Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 7
IX.2.3 Etuja Voidaan piilottaa olion käyttäjiltä se, että olio sijaitsee toisessa osoiteavaruudessa Voidaan tehdä optimointeja oliota käsiteltäessä Esim. luoda suuria olioita tarvittaessa Voidaan automatisoida muistin vapautus ym. siivousoperaatiot Erityisesti kielissä, joissa ei ole automaattista roskien keruuta Suunnittelumallit Proxy et. al. 8
IX.3 Factory Method (Tehdasmetodi) Luontimalli Käytetään, kun on luotava olioita, joiden tarkkaa tyyppiä ei tunneta Halutaan antaa vastuu olioiden luomisesta aliluokille Käytetään, kun luokilla avustavia aliluokkia ja halutaan säilyttää paikallisena tieto siitä, mitä apuluokkaa käytetään Esimerkki: Ohjelmassa sovellusolio ja dokumenttiolio, joka voi olla monen tyyppinen. Sovellusolio luo dokumenttiolion, mutta perusluokka ei tiedä tyyppiä. Peritään sovellusluokka aliluokkiin, jotka luovat sopivan dokumenttiolion Suunnittelumallit Proxy et. al. 9
IX.3.1 Mallin luokkakaavio Tuotteiden kantaluokka Konkreettinen tuote Esittelee tehdasmetodin, joka palauttaa Producttyyppisen olion Uudelleenmäärittelee tehdasmetodin palauttamaan ConcreteProduct-olion Factory Method-mallin luokkarakenne. Vrt. Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 10
IX.3.2 Huomioita Etuja Poistetaan tarve liittää ohjelmaan sovelluskohtaisia luokkia Käsitellään ainoastaan Product-rajapintaa -> sovellus toimii minkä tahansa aliluokan kanssa Haitta: Voi johtaa monimutkaiseen luokkarakenteeseen Yleensä jokaista luotavaa luokkaa kohti uusi Creatorluokan aliluokka Tehdasmetodia ei tarvitse kutsua Creator-luokista Jos kutsutaan ulkopuolelta, voidaan kytkeä rinnakkaiset luokkarakenteet toisiinsa Suunnittelumallit Proxy et. al. 11
IX.3.2 Toteutuksesta 1. Creator abstrakti luokka, ei toteutusta tehdasmetodille Aliluokkien määriteltävä toteutus Käytetään luotaessa olioita ennalta tuntemattomista luokista 2. Creator konkreettinen, oletustoteutus tehdasmetodille Ei pakko uudelleenmääritellä Käytetään yleensä mukavuussyistä Parametrisoidut tehdasmetodit Useammanlaisia tuotteita parametrin perusteella Malliluokkien käyttö Ei tarvita välttämättä useita Creatorin aliluokkia Suunnittelumallit Proxy et. al. 12
IX.4 Prototype (Prototyyppi) Tilanne: luotava olio luokasta, jonka instansseja ei osata tehdä Esimerkki: Graafisessa editorissa työkalu, joka lisää dokumenttiin elementtejä käsiteltäväksi Työkalun ei tarvitse osata luoda elementtejä Ratkaisu: Käytetään mallina esimerkkioliota, joka kopioidaan Suunnittelumallit Proxy et. al. 13
IX.4.1 Sovellettavuus Järjestelmä ei saisi riippua siitä, miten sen tuottamat oliot luodaan ja jokin seuraavista ehdoista on voimassa: 1. Luotavan olion tyyppi määräytyy ajonaikaisesti 2. Halutaan välttää Factory Method-suunnittelumallin tehdasluokkien rakennetta 3. Luotavan luokan olioilla voi olla hyvin harvoja laillisia tiloja. Tällöin voi olla kätevämpää luoda olio kopioimalla kuin alustamalla suoraan Suunnittelumallit Proxy et. al. 14
IX.4.2 Luokkakaavio Luo uusia olioita Luotavien olioiden rajapinta Toteuttaa metodin itsensä kopioimiseksi Prototype-mallin luokkarakenne. Vrt. Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 15
IX.4.3 Huomioita Etuja Factory Method-malliin nähden Yksinkertaisempi luokkarakenne Ei tarvita luomiseen aliluokkia Joustavampi Voidaan tuoda uusia luokkia ajonaikaisesti Voidaan tehdä useita malleja samasta luokasta Rajoitus: Kaikissa kopioitavissa olioissa oltava clone() Vaikeaa, jos sovelletaan vanhaan luokkarakenteeseen Suunnittelumallit Proxy et. al. 16
IX.4.4 Toteutuksesta Vaikeinta clone()-metodin toteuttaminen: Pinta- vai syväkopio? Koosteoliolle tarvitaan usein syväkopio C++:ssa käytetään hyväksi kopiointimuodostinta Javassa Objcet-luokassa clone()-metodi Tekee pintakopion Toteutettava Cloneable-rajapinta, jotta saadaan käyttöön Product-luokkiin voidaan toteuttaa myös metodi create() Tekee oletusolion malliolion luokasta Suunnittelumallit Proxy et. al. 17
IX.5 Singleton (Ainokainen) Vaatimukset: Luokan instanssien määrä rajoitettu yhteen Instanssi käytettävissä monissa paikoissa eikä haluta käyttää globaalia muuttujaa Luokka rajoittaa instanssinsa yhteen ja tarjoaa pääsyn ainoaan olioonsa Esimerkki: Halutaan toteuttaa ohjelmassa globaali tietosäiliö, joita voi olla vain yksi kappale Suunnittelumallit Proxy et. al. 18
IX.5.1 Luokkakaavio Singleton-mallin luokkarakenne. Vrt. Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 Suunnittelumallit Proxy et. al. 19
IX.5.2 Toteutuksesta Instanssi saadaan luokkametodilla Luokan muodostimet private-tyyppisiä Olioita ei voi luoda luokan ulkopuolelta Voidaan kontrolloida muiden olioiden pääsyä instanssiin Ei tarvita globaalia muuttujaa Singleton-luokka voidaan periä ja käyttää aliluokkaa Voidaan helposti muokata niin, että luokan olioita luotavissa jokin muukin kiinteä lukumäärä Suunnittelumallit Proxy et. al. 20