200 likes | 379 Views
Flyweight. Autor: Milan Šafárik. Úvod. Tento vzor patrí do skupiny Structural Patterns . Jeho využitie je veľmi špecifické. Rieši problém, akým spôsobom zaistiť efektívnu správu veľkého množstva objektov, ktoré sa príliš neodlišujú. Motivácia.
E N D
Flyweight Autor: Milan Šafárik
Úvod • Tento vzor patrí do skupiny StructuralPatterns. • Jeho využitie je veľmi špecifické. • Rieši problém, akým spôsobom zaistiť efektívnu správu veľkého množstva objektov, ktoré sa príliš neodlišujú.
Motivácia • Pri niektorých aplikáciách môže byť výhodné využívať objekty na reprezentáciu všetkých aspektov danej aplikácie. Naivný prístup môže byť pamäťovo príliš nákladný. • Príkladom môže byť textový editor, ktorý využíva objekty na reprezentáciu vložených prvkov ako sú obrázky alebo tabuľky. Využitím objektov na reprezentáciu jednotlivých písmen by sa stala aplikácia flexibilnejšou. Obyčajne sa ale toto riešenie nezvykne nepoužívať.
Motivácia Diagram znázorňujúci možné využitie objektov na reprezentáciu znakov.
Motivácia Nevýhodou tohto dizajnu je jeho pamäťová náročnosť. Už stredne veľké dokumenty môžu potrebovať stovky tisíc objektov, ktoré spotrebujú veľké množstvo pamäte. Flyweight vzor popisuje, ako zdieľať objekty bez prílišných nákladov. Flyweight je zdieľaný objekt, ktorý môže byť použitý v mnohých kontextoch súčasne. Obsahuje dva typy stavov: vnútorný a vonkajší stav. Vnútorný stav je uložený v objekte. Pozostáva z informácii, ktoré sú nezávislé na Flyweight kontexte.
Motivácia Vonkajší stav Flyweight neobsahuje, iba ho získava od klientskych objektov. Stavy Flyweight objektu textového editora: • Vnútorný stav: Charactercode • Vonkajší stav: Pozícia, Typograficky štýl. Každý výskyt rovnakého znaku v dokumente teda bude odkazovať na rovnakú inštanciu v zdieľanom úložisku Flyweight objektov.
Uplatnenie Efektívnosť Flyweight vzoru silne závisí na tom, ako a kde je použitý. Využiť Flyweight sa odporúča, ak všetky tieto tvrdenia sú splnené: • Aplikácia využíva veľký počet objektov a skladovacie náklady sú vysoké. • Objekty sú náročné na úložný priestor. • Veľké množstvo informácii o objekte sa dá previesť do vonkajšieho stavu. • Nezáleží na identite objektu a zdieľanie je efektívne.
Účastníci Flyweight • Deklaruje rozhranie, pomocou ktorého môžu Flyweight prijímať a reagovať na vonkajší stav. ConcreteFlyweight • Implementuje rozhranie Flyweight a pridáva úložisko pre vnútorný stav. ConcreteFlyweight musí byť zdielateľná, teda musí byť nezávislá na kontexte, v ktorom sa používa.
Účastníci UnsharedConcreteFlyweight • Nie všetky Flyweight musia byť zdielateľné. Flyweight rozhranie umožňuje zdieľanie, ale nevynucuje ho. Zvyknú mať potomkov ConcreteFlyweight. FlyweightFactory • Vytvára a spravuje Flyweight objekty. • Zabezpečuje, aby boli Flyweight objekty zdieľané správne. Keď klient žiada Flyweight, Factory dodáva existujúcu inštanciu alebo vytvorí novú, ak neexistuje. Client • Uchováva referencie na Flyweight objekty. • Počíta alebo uchováva vonkajší stav týchto objektov.
Štruktúra zdieľania Diagram znázorňujúci ako sú Flyweight zdieľané:
Zhrnutie Stav, ktorý Flyweight potrebuje na fungovanie je delený na vnútorný a vonkajší. Vnútorný je uložený v ConcreteFlyweight objekte, vonkajší je počítaný alebo uložený v client objektoch. Tento stav odovzdáva Flyweight objektu vtedy, keď požaduje nejakú operáciu. Klienti nemajú prístup na vytvorenie Flyweight objektov. Môžu ich získať len z FlyweightFactory objektu, ktorý zabezpečuje správne zdieľanie.
Následky • Nižšia prehľadnosť kódu. • Používa sa relatívne málo, lebo je vhodný len za špecifických podmienok. • Nižšie pamäťové nároky (čím viaczdieľaných flyweight objektov, tým viac ušetreného miesta) • Vyššie runtime náklady spojené s prevodom, hľadaním a počítaním vonkajšieho stavu.
Príbuzné vzory • Flyweight sa často používa s Composite vzorom na reprezentáciu hierarchickej štruktúry grafu so zdieľanými listami. Dôsledkom zdieľania je, že listy nemôžu ukladať ukazovateľ na svojich rodičov. Namiesto toho, ukazovateľ mu je dodaný v rámci jeho vonkajšieho stavu. • FactoryMethod sa môže využiť pri vytváraní nových inštancií zdieľaných objektov.