specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

Podobné dokumenty
Abstract Factory úvod

Kód, který se nebude často měnit

Úvod - problém. Při přidání nového modelu je nutné upravit. Kód, který se nebu de často měnit. n Mějme obchod s auty:

Literatura. E. Gamma, R. Helm, R. Johnson, J. Vlissides The Gang of Four (GoF) Design Patterns Elements of Reusable Object-Oriented Software 1995

Návrhové vzory. n OO jazyky - široká paleta technických prostředků. n Návrhový vzor. n rozhraní!! n volnější vazby, parametrizace

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Programování v C++ 2, 7. cvičení

Základy objektové orientace I. Únor 2010

Programování v C++ 1, 5. cvičení

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

PREPROCESOR POKRAČOVÁNÍ

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

, Brno Připravil: David Procházka Návrhové vzory

PB161 Programování v jazyce C++ Přednáška 9

Programování v C++ 1, 6. cvičení

Chain of responsibility

Více o konstruktorech a destruktorech

Návrhový vzor Factory v JAVA API

1. Dědičnost a polymorfismus

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Generické programování

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Návrhové vzory OMO, LS 2014/2015

7.5 Diagram tříd pokročilé techniky

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Vyřešené teoretické otázky do OOP ( )

typová konverze typová inference

Konstruktory a destruktory

konstruktory a destruktory (o)

PB161 Programování v jazyce C++ Přednáška 4

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Programování v C++ 2, 4. cvičení

20. Projekt Domácí mediotéka

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Obsah Znovupou ˇzitelnost N avrhov e vzory Z asady programov an ı Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady... 2/ 46

7.5 Diagram tříd pokročilé techniky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Programování v C++ 2, 8. cvičení

Semin aˇr Java X Radek Koˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2011 Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady...

Mělká a hluboká kopie

Dědění, polymorfismus

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

návrhový vzor Singleton.

Principy objektově orientovaného programování

Výčtový typ strana 67

Abstraktní třídy, polymorfní struktury

Abstraktní třída a rozhraní

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Programování v C++ 3, 3. cvičení

Programování II. Návrh programu I 2018/19

Facade. Známý jako. Účel. Motivace. Facade, Fasáda

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Programování II. Polymorfismus

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

PB161 Programování v jazyce C++ Přednáška 4

Teoretické minimum z PJV

IRAE 07/08 Přednáška č. 1

SW_12. Vzor Příkaz - Command Vzor Návštěvník - Visitor

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Objektově orientované programování v PHP 5. Martin Klíma

Chování konstruktorů a destruktorů při dědění

Seminář Java IV p.1/38

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

přetížení operátorů (o)

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

Programování v Javě I. Leden 2008

Jazyk C++ II. Šablony a implementace

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 6)

24. listopadu 2013, Brno Připravil: David Procházka

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Seminář Java II p.1/43

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Zdeněk Pavlů

Jazyk C++ II. Výjimky

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Jazyk C++ I. Polymorfismus

Pokročilé schopnosti OOP

Mnohotvarost (polymorfizmus)

Dolování v objektových datech. Ivana Rudolfová

Transkript:

Prototyp

Prototyp Účel ( creational kategorie: vytvářecí pro objekty (class specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu Příklad obecný systém pro tvorbu grafických editorů abstraktní třídy Graphic, Tool a její podtřída GraphicTool, která vytváří grafické komponenty typu Graphic úpravou chceme získat editor hudebních partitur (noty, pomlčky, osnovy jako ( Graphic podtřídy problém jak vytvářet objekty konkrétních tříd pro noty, pomlčky a osnovy obecnou třídou GraphicTool? řešení: GraphicTool vytvoří novou třídu Graphic pomocí klonování (kopírování) instance podtřídy Graphic prototyp GraphicTool je parametrizovaný tímto prototypem, který se umí sám naklonovat = musí implementovat metodu Clone()

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

Použití Prototyp použití Systém má být nezávislý na vytváření, skládání a zobrazovaní produktů a pokud jsou třídy, kterých instance se mají vytvořit, specifikované za běhu, např. pomocí dynamického načítání, nebo pokud se chceme vyhnout budování hierarchie tříd továren, která je souběžná s hierarchií tříd produktů, nebo pokud se instance třídy může nacházet jen v několika málo stavech, je výhodnější nainstalovat odpovídající počet prototypů a ty klonovat, jako za každým vytvářet instance tříd s příslušným stavem

Struktura Prototyp struktura Účastníci Prototype (Graphic) deklaruje rozhraní pro vlastní klonování ( HalfNote ConcretePrototype (Staff, WholeNote, implementuje operace pro vlastní klonování Client (GraphicTool) vytváří nový objekt požádáním prototypu aby se naklonoval

Prototyp důsledky Skrývá konkrétní produktové třídy před klientem a tím snižuje počet názvů, o kterých klienti vědí Umožňuje klientovi: přidávat a odebírat produkty za běhu specifikovat nové objekty pomocí změn hodnot existujících objektů specifikace nových objektů změnou struktury vytváření menšího počtu podtříd dynamická konfigurace aplikace pomocí tříd Nevýhoda každá podtřída musí implementovat Clone(), může být někdy obtížné ( copy-konstruktorů (cyklické odkazy, třídy bez

Prototyp implementace Třeba brát v úvahu: použití správců prototypů počet prototypů v systému není pevný, můžou se vytvářet a odstraňovat správce prototypů asociační sklad; vrací, registruje prototyp odpovídající zadanému klíči implementace operace Clone obtížné (kruhové odkazy) většina jazyků poskytuje podporu pro kopírovaní objektů např. C++ copy konstruktor mělká vs. hluboká kopie (třída obsahuje ukazatel) save a load objektů jednoduchá implementace Clone

Prototyp implementace inicializace klonů někteří klienti jsou s objektem úplně provázaní, některé potřebují objekty inicializovat podle svých požadavků inicializace nemůže probíhat obecně přes Clone(), různý počet inicializačních parametrů řešení operace pro nastavení stavu objektu metoda Initialize(), při hluboké kopii operací Clone() může být nutné odstranit kopie

Prototyp příklad nadefinujme podtřídu MazePrototypeFactory třídy MazeFactory, kterou nainicializujeme pomocí prototypů objektů, které má vytvářet ušetřili jsme vytváření jejích podtříd pro každý druh stěn nebo místností, které chceme vytvářet podtřída rozšiřuje rozhraní pomocí konstruktoru, který má prototypy jako argumenty 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 jednoduché metody pro tvorbu (stěn, místností, dveří) klonují prototyp a potom ho inicializují 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; bludiště vytvoříme pomocí MazePrototypeFactory inicializovanou prototypy základních komponent bludiště MazeGame game; MazePrototypeFactory simplemazefactory( new Maze, new Wall, new Room, new Door ); Maze* maze = game.createmaze(simplemazefactory);

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

Prototyp příklad podtřída BombedWall musí operaci Clone přetížit a implementovat příslušný kopírovací konstruktor 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); 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*)

Prototyp související NV Abstract Factory některými způsoby si konkurují společné použití: abstraktní továrna může ukládat sadu prototypů, ze kterých se mají klonovat a vracet produktové objekty Návrhy používající vzory Composite a Decorator, můžou často a s výhodou používat i vzor prototyp