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.

Slides:



Advertisements
Podobné prezentace
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.
Advertisements

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
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové programování
Návrhové vzory Filip Zavoral
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
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.
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.
Prototyp. O čem to bude? Prototyp Účel  vytváření objektů  nový objekt se vytváří kopírováním (klonováním) vzoru – prototypu.
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.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
Objektově orientované programování. Objektově orientovaný přístup k programování je zcela jiný způsob přemýšlení. Jedná se o moderní styl programování,
Školení MS Word 2007 pro začátečníky RNDr. Milan Zmátlo MěÚ Třebíč, říjen 2011 Vzdělávání v eGON centru Třebíč Tento.
Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Kateřina Raichová. Materiál je publikován pod licencí Creative Commons. ze sady:3tematický.
Pořízení dat Databázové funkce Řazení Filtrování Souhrny Kontingenční tabulky Kontingenční grafy.
Program Malování Vytvořila Jana Šimková, ZŠ a MŠ Mladoňovice Materiál vznikl v rámci projektu Šance pro všechny č.proj. CZ.1.07/1.4.00/
Praha6.cz Administrace portálu. Struktura informací Hlavní strom  Stránky se statickým textem automatické oživení ( , web, tel., RMČ/ZMČ) textové.
Programování v jazyce C++ Dědičnost a polymorfismus.
Tabulátory (20). Projekt: CZ.1.07/1.5.00/ OAJL - inovace výuky Příjemce: Obchodní akademie, odborná škola a praktická škola pro tělesně postižené,
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
Co nového ve VVIS Tereza Černá
Číslo projektuCZ.1.07/1.5.00/ Číslo materiáluVY_32_INOVACE_30-03 Název školy Střední průmyslová škola stavební, České Budějovice, Resslova 2 AutorRNDr.
Memento. Motivace – kalkulačka 210° sin * /20 ? 0.25 ^2 ?
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
Prezentace Powerpoint 1 Prezentace vznikla v rámci projektu Škola 21. století, reg. číslo: CZ.1.07/1.3.06/ , který realizuje ZŠ a MŠ Lomnice nad.
KURZ ALGORITMIZACE A PROGRAMOVÁNÍ V JAZYCE C Lekce č. 10: Tvorba vlastních funkcí Bc. Radek Libovický.
Úvod do databází MS Access (1).
Microsoft Excel verze 2010 Mgr. Přemysl Kejzlar.
model fungování a praxe
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Výukový materiál zpracován v rámci projektu
Bohumil Havel MoodleMoot.cz 2016
Výukový materiál zpracován v rámci projektu
Výstupní zařízení počítače - tiskárny
COM – Práce s objektovým modelem jiné aplikace
Y36PJC Programování v jazyce C/C++
State 1.
Programování v jazyce C++
Abstraktní datové typy
Struktury.
Návrhový vzor Flyweight
Databáze MS ACCESS 2010.
Configuration Patterns
Abstract Factory.
C# konzole – Součet dvou čísel
Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,
Digitální učební materiál zpracovaný v rámci projektu
C# Vícevláknové aplikace
Bridge.
Cvičení 4 Dědičnost objektů.
Microsoft Office Access
Visitor 1 1.
Lotus Notes Lotus Notes Alena Málková
Materiál byl vytvořen v rámci projektu
Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“
C# přehled vlastností.
3. Odborná literatura, její zdroje na internetu a PřFUK
Analýza informačního systému
Vázání dat Data Binding
Úvod do objektového návrhu
Výčtové typy ( Java 5 ) Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí. V nejjednodušší variantě se definují příkladmo takto:
Adapter
Composite “Spojuj a panuj”.
Bridge.
Class Diagrams.
Návrhový vzor Prototype.
Transkript prezentace:

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

Motivace – Grafický editor Obecný grafický editor  Graphic obecný grafický objekt  Tool umí cosi dělat s objekty Graphic třída GraphicTool produkuje komponenty Graphic Editor hudebních partitur  noty, pomlky,... – podtřídy Graphic  problém – jak pomocí GraphicTool vytvářet instance konkrétních tříd? GraphicTool je obecná!

Motivace – Řešení 1 – paralelní Creator třídy Návrh: Application specific classes Tool Manipulate() Staff Draw(Position) GraphicTool Manipulate() Graphic Draw(Position) GraphicToolStaff Manipulate() Nový potomek pro každou grafickou třídu Framework classes

Motivace – Řešení 2 - Generics Návrh class GraphicTool where T : Graphic, new() { public GraphicTool() { T g = new T(); //zobraz grafický objekt } Jsme omezeni na jeden způsob konstrukce

Motivace – Řešení 3 - Prototype Návrh: Elegantnější!!! Třídy aplikace Třídy frameworku

Prototyp – struktura Prototype: deklaruje rozhraní pro klonování ConcretePrototype: implementuje klonování Client: vytváří objekt zavoláním metody Clone() na prototype Client operation() Prototype clone() prototype ConcretePrototype1 clone() ConcretePrototype2 clone() Vrací svou kopii p = prototype.clone()

Prototyp – příklad struktury abstraktní třída (rozhraní) pro grafické objekty nástroj pro tvorbu objektů je parametrizovaný konkrétní instancí - prototypem abstraktní třída pro manipulaci s grafickými objekty

Prototyp – použití Kdy se nám hodí?  nechceme duplikovat hierarchii tříd paralelní hierarchií továren  jedna třída, několik málo stavů  drahá konstrukce objektu Jak tyto problémy řeší?  továrnu nepotřebujeme, kód pro vytváření je v Clone()  místo vytváření třídy vyrobíme prototypickou instanci pro každý stav  ke konstrukci dojde jen jednou, poté klonujeme

Prototyp – implementace Operace Clone  „mělká vs. hluboká“ kopie  Mělká kopie  Hluboká kopie  pozor na cyklické reference!!  builtin podpora C++ copy konstruktor Java: Object.clone(), interface Cloneable = prototyp C#: object.MemberwiseClone(), ICloneable AB AClone AB public Object clone() throws CloneNotSupportedException { A aClone = (A)super.clone(); aClone.b = (B)b.clone(); return aClone; } Interně se nevolá konstruktor public object Clone() { { f.Serialize(this); var aClone =(A)f.Deserialize(); return aClone; }

Prototyp – implementace další parametry pro konstruktor?  Clone() to neumí  Initialize(...) pozor na deep copy a leaky Správce prototypů  volitelně  dynamický katalog, asociativní pole  vyhledávání, registrace prototypů pro nějaký klíč

Prototyp – příklad implementace třída MazePrototypeFactory konstruktor MazePrototypeFactory přebírá prototypy jako argumenty ušetřili jsme tvorbu podtříd pro každý druh stěn nebo místností class MazePrototypeFactory : public MazeFactory { public: MazePrototypeFactory (Maze*, Wall*, Room*, Door*); virtual Maze* MakeMaze() const; virtual Room* MakeRoom(int) const; virtual Wall* MakeWall() const; virtual Door* MakeDoor(Room*, Room*) const; private: Maze* prototypeMaze_; Room* prototypeRoom_; Wall* prototypeWall_; Door* prototypeDoor_; }; MazePrototypeFactory:: MazePrototypeFactory ( Maze* m, Wall* w, Room* r, Door* d) { prototypeMaze_ = m; prototypeWall_ = w; prototypeRoom_ = r; prototypeDoor_ = d; }

Prototyp – příklad implementace jednoduché metody pro tvorbu (stěn, místností, dveří)‏  klonují prototyp a potom ho inicializují bludiště vytvoříme pomocí MazePrototypeFactory inicializovanou prototypy základních komponent bludiště Wall* MazePrototypeFactory::MakeWall () const { return prototypeWall_->Clone(); } Door* MazePrototypeFactory:: MakeDoor (Room* r1, Room *r2) const { Door* door = prototypeDoor_->Clone(); door->Initialize(r1, r2); return door; } MazeGame game; MazePrototypeFactory simpleMazeFactory( new Maze, new Wall, new Room, new Door ); Maze* maze = game.CreateMaze(simpleMazeFactory);

Prototyp – příklad implementace změna typu bludiště – inicializovat MazePrototypeFactory pomocí jiné sady prototypů objekt, který chceme použít jako prototyp, např. instance Door, musí podporovat operaci Clone, případně operaci Initialize MazePrototypeFactory bombedMazeFactory( new Maze, new BombedWall, new RoomWithABomb, new Door); class Door : public MapSite { public: Door(); Door(const Door&); virtual void Initialize(Room*, Room*); virtual Door* Clone() const; virtual void Enter(); Room* OtherSideFrom(Room*); private: Room* room1_; Room* room2_; }; Door::Door (const Door& other) { room1_ = other.room1_; room2_ = other.room2_; } void Door::Initialize (Room* r1, Room* r2) { room1_ = r1; room2_ = r2; } Door* Door::Clone () const { return new Door(*this); }

Prototyp – příklad implementace podtřída BombedWall musí operaci Clone přetížit a implementovat příslušný kopírovací konstruktor klienti klonující prototyp neví o jeho konkrétní podtřídě  např.: BombedWall::Clone() vrací Wall*,  ale implementace vrací ukazatel na novou instanci podtřídy ( BombedWall* )‏ Skrývá podtřídu klientům class BombedWall : public Wall { public: BombedWall(); BombedWall(const BombedWall&); virtual Wall* Clone() const; bool HasBomb(); private: bool bomb_; }; BombedWall::BombedWall (const BombedWall& other) : Wall(other) { bomb_ = other.bomb_; } Wall* BombedWall::Clone () const { return new BombedWall(*this); }

Praktické využití: Cacheování dat

public interface IPrototype { IPrototype Clone(); } public class Configuration : IPrototype { private string fileInformation; public void GetFileInformation() { Thread.Sleep(5000); //Nahrazeni asynchronniho volani fileInformation = "Long file information"; } IPrototype IPrototype.Clone() { Configuration c = new Configuration(); c.fileInformation = this.fileInformation; return c; } public void ShowInformation() { Console.WriteLine("Showing " + fileInformation); }

Praktické využití: Cacheování dat public class PrototypeManager { private Dictionary list = newDictionary (); public void AddPrototype(IPrototype p, int index) { list.Add(index, p); } public IPrototype GetPrototype(int index) { return list[index].Clone(); }

Praktické využití: Cacheování dat static void Main(string[] args) { Configuration c = new Configuration(); c.GetFileInformation(); UserProfile up = new UserProfile(); up.GetDatabaseInformation(); PrototypeManager manager = new PrototypeManager(); manager.AddPrototype(c, 0); manager.AddPrototype(up, 1); (manager.GetPrototype(0).Clone() as Configuration).ShowInformation(); (manager.GetPrototype(1).Clone() as UserProfile).ShowData(); } Rychlé Pomalé

Porovnání s ostatními vzory Factory method  Snadná na implementaci  Není moc komplexní  Vytváří nový objekt od začátku Abstract Factory, Builder  Vysoce flexibilní  Komplexní  Oddělení objektu od jeho vytváření  Vytváří nový objekt od začátku Prototype  Vysoce flexibilní  Komplexní  Objekt a způsob jeho vytváření jsou specifikovány na stejném místě  Kopíruje již existující objekt

Typické využití Nástroj pro grafické prvky  Elektrické obvody  Hudební software  Šablony Pokud je vytváření instance drahé  např: parsování XML dat pouze jednou  Cacheování dat z databází Pokud instance třídy mají málo možných stavů  katalog barev, fontů

Shrnutí - výhody Možnost vytvářet objekty bez znalosti konkrétních tříd Specifikace nových objektů změnou hodnoty (flexibilní chování)  Snížení počtu podtříd Specifikace nových objektů změnou struktury (kompozice) Odstranění hierarchie továren Vytváření instancí = volání Clone() Implementace v prototypu – žádná jiná třída není ovlivněna.

Shrnutí - nevýhody Nutnost úpravy kódu, pokud třída neimplementuje metodu clone() Cyklické reference