Návrhový vzor Prototype.

Slides:



Advertisements
Podobné prezentace
Normalizace Řada analytiků se mylně domnívá, že pro každý objekt existuje jedno jediné univerzálně použitelné nejlepší řešení bez ohledu na řešený problém.
Advertisements

(instance konkrétní třídy)
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Proxy. Definice  zástupce nebo náhradník za dotyčný objekt  proxy i zastoupený objekt dědí od stejného interfacu  proxy kontroluje přístup k objektu.
10. Dynamické datové struktury
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Čtvrté cvičení Objektové programování Objektový model v Javě
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
Základní škola a mateřská škola Bzenec Číslo projektu: CZ.1.07/1.4.00/ Číslo a název šablony klíčové aktivity: III/2: využívání ICT – inovace Vypracoval/a:
Chain of responsibility Martin Malý prezentace na předmět Návrhové vzory (PRG024) na MFF UK
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Ing. Josef Veselý Označení šablony a vzdělávací sady viz.rozpis.
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
KEG Použití vzorů při vyhledávání na webu Václav Snášel.
Objektové programování
Návrhové vzory Filip Zavoral
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
6. cvičení Polymorfismus
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
PB161 Principy OOP - rozhraní, dědičnost PB161 | Principy OOP - Dědičnost, rozhraní
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Šesté cvičení Výjimky Balíky.
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
Vzor na všechno. Vzor – úvod Problém .. Příklad: widgety .. Jak na to? .. Známý také jako...
Abstract Factory. Abstract Factory – úvod Situace  potřebujeme vytvářet objekty ze skupiny souvisejících nebo na sobě závislých tříd  2 „druhy“ GUI.
Factory Method. Motivace – tisk Knihovna tiskne dokumenty do pdf File Open() Close() Print() PresentationWritingDrawing Knihovna tiskne obrázky do pdf.
Vzdálená správa Tomáš Kalný.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Prototyp. O čem to bude? Prototyp Účel  vytváření objektů  nový objekt se vytváří kopírováním (klonováním) vzoru – prototypu.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Iterator Iterator – Problém struct Item { int _value; Item * _next; Item( int value, Item * next ) : _value( value ), _next( next ) { } }; void Print(
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
Prototyp. O čem to bude? Prototyp Záměr  vytváření objektů  nový objekt se vytváří kopírováním (klonováním) vzoru – prototypu.
Composite “ Spojuj a panuj ”. Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž.
Iterator. C historie int * rand_numbers(int n) { int *numbers = malloc(n * sizeof(int)); int *it = numbers; while (it < numbers + n) *it++ = rand(); //
Delphi – práce se základními komponentami (2. hodina) OB21-OP-EL-KON-DOL-M-4-008B Orbis pictus 21. století.
Vývojová prostředí Objektově Orientované Programování OB21-OP-EL-KON-DOL-M Orbis pictus 21. století.
NÁZEV ŠKOLY:SOŠ Net Office, spol. s r.o. Orlová Lutyně
SOLID principy v OOP návrhu
Programovací jazyk C# 4. část - cykly.
Návrhové vzory Filip Zavoral
Výukový materiál zpracován v rámci projektu
ZAL – 3. cvičení 2016.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Abstract Factory.
Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek.
Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.
Bridge.
C# přehled vlastností.
Unit of Work vzor z P of EAA (Fowler) 1.
Decorator.
Monitor Object 1.
GRASP Patterns.
Composite “Spojuj a panuj”.
Bridge.
Transkript prezentace:

Návrhový vzor Prototype

Situace chceme vytvořit grafický editor pro různé neznámé objekty může to být cokoliv – text, obrázky, „čáry“ s hlubším významem, noty různé tlačítka budou umožňovat přidávání, upravování, posouvání prvků atd.

Situace GraphicTool potřebuje způsob, jak vytvořit objekty, s kterými má pracovat

Řešení nebudeme vytvářet třídu NěcoGraficTool pro každý druh prvků (WholeNoteGT, HalfNoteGT,..) vytvoříme jenom jednu třídu a jednotlivé instance inicializujeme instancí prvku (WholeNote, HalfNote,...), který budeme kopírovat taková instance se jmenuje prototype

Popis vzoru Prototype „tvořivý“ (creational) návrhový vzor systém (Client) je nezávislý na produktech (objektech), s kterými pracuje nezná vnitřní strukturu objektů, jenom veřejný interface systém neví, kterou konkrétní třídu používá zná jenom (abstraktního) předka této třídy podstatou je schopnost prototypu vytvářet svou kopii prototype->clone();

Účastníci: Prototype (abstraktní třída) ConcretePrototype (podtřídy) Client

Implementace Prototype class ListPrototypes { public: WholeNote* wholeNote = new WholeNote; HalfNote* halfNote = new HalfNote; Staff* staff = new Staff; ... } class Graphic { public: virtual int Draw(int x, int y) = 0; virtual Graphic* Clone() = 0; }; class WholeNote : public Graphic { virtual int Draw(int x, int y); virtual Graphic* Clone() { /*return copy of self*/ } class HalfNote : public Graphic { ... class GraphicTool : public Tool { public: //constructor GraphicTool(Graphic* gr) { _prototype = gr; } virtual int Manipulate() { Graphic* p = _prototype->Clone(); /*do something with the clone*/ private: Graphic* _prototype; ... }; GraphicTool WholeNoteGT = GraphicTool(ListPrototypes.wholeNote); GraphicTool HalfNoteGT = GraphicTool(ListPrototypes.halfNote);

Implementace Prototype registr prototypů – prototype manager ukládá a vrací prototypy na základe klíče možnost upravovat za běhu programu operace clone() může být obtížná pokud chceme použít již existující třídu pokud objekt obsahuje prvky, které nepodporují kopírování pokud objekt obsahuje cyklické reference deep copy vs. shallow copy nutno přemýšlet, co mohou objekty sdílet

Implementace Prototype inicializace klonů někdy Client potřebuje inicializovat stavy objektů možnosti: třída (prototype) již obsahuje operace na úpravu svých částí pokud ne, je nutno implementovat operaci initialize() která vezme inicializační parametry a nastaví je klonu virtual Door* MakeDoor( Room* r1, Room* r2) const { return new Door(r1, r2); } Door* MazeCreator::MakeDoor ( Room* r1, Room *r2) const { Door* door = _prototypeDoor->Clone(); door->Initialize(r1, r2); return door; }

Použití a výhody Prototype usnadňuje tvorbu více netriviálních objektů např. při konstrukci objektu načtením ze souboru (předpokládáme, že soubor je již načten v prototypu) přidávaní produktů v run-time registrací nového prototypu

Použití a výhody Prototype nové chování za pomoci změny hodnot není třeba mnoho nových tříd redukování hierarchií tříd továren pro danou hierarchii tříd produktů postačí jedna třída pro továrnu parametrizována prototypem

class MazeFactory { public: virtual Maze* MakeMaze() const { return new Maze; } virtual Wall* MakeWall() const { return new Wall; } virtual Room* MakeRoom(int n) const { return new Room(n); } }; class EnchantedMazeFactory : public MazeFactory { { return new EnchantedRoom(n, CastSpell()); } private: ... class BombedMazeFactory { return new BombedWall; } { return new RoomWithABomb(n); } MazeGame game; BombedMazeFactory BMfactory; game.CreateMaze(BMfactory); class MazePrototypeFactory : public MazeFactory { public: MazePrototypeFactory(Maze*, Wall*, Room*); virtual Maze* MakeMaze() const; virtual Wall* MakeWall() const; virtual Room* MakeRoom(int) const; private: Maze* _prototypeMaze; Wall* _prototypeWall; Room* _prototypeRoom; }; //constructor MazePrototypeFactory::MazePrototypeFactory( Maze* m, Wall* w, Room* r) { _prototypeMaze = m; _prototypeWall = w; _prototypeRoom = r; } Wall* MazePrototypeFactory::MakeWall() const { return _prototypeWall->Clone(); } ... MazePrototypeFactory simpleMazeFactory( new Maze, new Wall, new Room); game.CreateMaze(simpleMazeFactory); //or MazePrototypeFactory bombedMazeFactory( new Maze, new BombedWall, new RoomWithABomb); game.CreateMaze(bombedMazeFactory);

Prototype a jiné vzory Prototype může být použit jako alternativa k Abstract Factory / Factory Method Prototype může být použit spolu s Abstract Factory / Factory Method Prototype může být implementován pomocí Singletonu Prototype se může použít při implementování vzorů Composite a Decorator

Popis Prototype Princip: Obecný popis implementace a příklad: máme prototypy vzory jak, má něco vypadat klonováním prototypu vytváříme nové objekty tohoto typu Obecný popis implementace a příklad: prototype prototype Prototype Vojak Client Cviciste clone() clone() operation() vytvor_vojaka() p = prototype.clone() ConcretePrototype1 Kulometcik ConcretePrototype2 Snajpr clone() clone() clone() clone() Vrací svou kopii Vrací svou kopii Vrací svou kopii Vrací svou kopii

Popis Prototype Implementace v příkladu: class Cviciste { public Vojak vytvor_vojaka() { if (energieCviciste ≥ 50) return kulometcik.clone(); else return snajpr.clone(); } private Vojak kulometcik = new Kulometcik(); // prototyp private Vojak snajpr = new Snajpr(); // prototyp class Vojak { public abstract Vojak clone(); class Kulometcik extends Vojak { @Override public Vojak clone() { // vytvori kopii sebe sama class Snajpr extends Vojak {

Popis Prototype Poznámky: Někdy se používá Nevýhody: klient nezná konkrétní podtřídu, která mu byla vrácena pracuje pouze s abstraktním předkem pokud klonování je používáno v programu i jinde pro jiné účely, máme Prototype implementovaný „zadarmo“ Někdy se používá katalog prototypů (prototype manager) prototypy se registrují v katalogu (pod nějakým identifikátorem) klienti používají pro klonování prototypy z katalogu (a vytvářejí nové instance) metoda clone() nemusí provádět „deep copy“ ve některých případech stačí „shallow copy“ nebo nějaká jejich kombinace musíme si rozmyslet, co mohou klony sdílet a co ne Nevýhody: obtížné implementovat clone() metody do již existující hierarchie tříd obtížné implementovat clone() metodu pro třídy s nekopírovatelnými elementy nebo s cyklickými referencemi

Widget widget = new Widget(); Situace, kdy se hodí (1/5) Situace: konstrukce objektu vyžaduje netriviální práci (z hlediska velikosti kódu) např. při použití návrhových vzorů Decorator nebo Composite Příklad situace: často se řeší v různých editorech pro tvorbu elektrických obvodů, GUI apod. Problém: chceme-li více totožných objektů Některé možnosti řešení: Factory Method / Abstract Factory máme metodu, která provede konstrukční kód Prototype implementujeme metody Clone() výhody oproti továrnám: konstrukce objektu je na jednom místě, není nutné upravovat ještě továrnu vytvořit nové typy objektů lze v run-time (vytvořit novou továrnu v run-time obecně nelze) Builder Výhoda: flexibilnější Widget widget = new Widget(); widget = new LayoutableWidget(widget); widget = new BorderedWidget(widget); // hodne dalsich dekoraci

Situace, kdy se hodí (2/5) Situace: chceme/máme mnoho druhů instancí nějaké třídy např. mnoho potomků třídy nebo mnoho druhů různých parametrizací této třídy Příklad situace: např. vytváříme hru, v níž je velké množství zbraní, které jsou různě účinné a mají různý dosah Některé možnosti řešení: druh instance = nová dědící třída nevýhody nepraktické, může-li se počet druhů instancí měnit nepoužitelné, mohou-li se druhy instance generovat v run-time druh instance = sada parametrů hlavní třídy (nejsou zde žádné dědící třídy) výhoda: můžeme se zbavit toho velkého množství tříd, stačí nám jen jedna nevýhoda: špatně se s tím pracuje Prototype pro každý druh třídy vytvoříme prototyp výhody: flexibilní řešení můžeme se zbavit toho velkého množství tříd, stačí nám jen jedna unikátní vlastnost návrhového vzoru Prototype

Situace, kdy se hodí (3/5) Situace: „třídy se vytvářejí dynamicky v run-time“ Příklad situace: např. procedurálně generujeme různé druhy jednotek do nějaké hry Problém: chceme vytvářet instance nějaké této třídy Řešení: Prototype každou instanci vytvoříme jen jednou a uložíme si ji jako prototyp toto je něco, na co jiné návrhové vzory pro vytváření instancí neposkytují řešení

Situace, kdy se hodí (4/5) Situace: „je nutné duplikovat hierarchii tříd jak u těchto tříd, tak u jejich továren“ Příklad situace: např. Animal má potomky Dog a Cat, AnimalFactory má potomky DogFactory a CatFactory Problém: špatně se modifikuje hierarchie tříd Řešení: Prototype máme prototypy, nepotřebujeme továrny

Situace, kdy se hodí (5/5) Situace: „konstrukce objektu je netriviální (z hlediska časové efektivity)“ Příklad situace: např. při konstrukci objektu je nutná práce se souborem Problém: chceme se vyhnout každé další konstrukci objektu „od nuly“ Řešení: Prototype první konstrukci provedeme obvykle, každou další již pomocí klonování prototypu předpokládáme, že při dalších konstrukcích nebude třeba se souborem pracovat (např. je již načtený a jeho obsah je součástí prototypu)

Obecné vztahy k jiným návrhovým vzorům Abstract Factory / Factory Method Prototype a Abstract Factory a Factory Method slouží podobným účelům Prototype ale může někdy nabídnout více (viz předchozí slajdy) Composite, Decorator Prototype může sloužit pro uchování vytvořených kompozitů Singleton Prototype Manager může být řešen pomocí Singletonu

Známá použití A long, long time ago in a galaxy far, far away… Impérium použilo návrhový vzor Prototype pro výrobu Storm Trooperů Existují programovací jazyky, kde se objekty nevytvářejí obvyklým způsobem ale pomocí klonování prototypů Self živý jazyk (zatím poslední verze 2017) objektově-orientovaný, dynamicky typovaný, JIT některé JIT techniky byly zde nasazeny poprvé prototypovaný přístup k objektům vytvoříme nějaké objekty systémem „přidat element“, poté objekty klonujeme žádné třídy Omega