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.

Slides:



Advertisements
Podobné prezentace
Stránka 1, © Vema, a. s.. Stránka 2, © Vema, a. s. Podnikové aplikace  Integrovaný podnikový systém (Integrated Business System):  komplex aplikací.
Advertisements

(instance konkrétní třídy)
Stručný úvod do UML.
 Informací se data a vztahy mezi nimi stávají vhodnou interpretací pro uživatele, která odhaluje uspořádání, vztahy, tendence a trendy  Existuje celá.
Přednáška č. 5 Proces návrhu databáze
Workflow Foundation Základy a architektura
Průvodce pro prostorové dotazy v systému PostGIS (plugin pro OpenJUMP) Vedoucí: Ing. Jan Růžička.Ph.D. Konzultant: Ing. Aleš Daněk Diplomová práce.
Čtvrté cvičení Objektové programování Objektový model v Javě
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
Štěpán Lískovec, 4.A.  =základní programové vybavení počítače (tj.software)  hlavní úkol:  A, zajistit uživateli možnost ovládat PC  B, vytvořit pro.
Softwareová architektura
Objektové programování
Návrhové vzory Filip Zavoral
Operační systémy.
Operační systémy.
Relační databáze.
Vypracoval: Ondřej Dvorský Třída: VIII.A
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Informatika pro ekonomy II přednáška 10
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
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í.
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
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.
PHP PHP a MySQL - 15 Mgr. Josef Nožička IKT PHP
CZ.1.07/1.4.00/ VY_32_INOVACE_168_IT 9 Výukový materiál zpracovaný v rámci projektu Vzdělávací oblast: Informační a komunikační technologie Předmět:Informatika.
Operační systémy Mgr. Ludmila Faltýnková EU OPVK ICT2-4/Inf12 Základní škola Olomouc, Heyrovského 33 Určeno pouze pro výuku Žádná část ani celek nesmí.
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Databáze Lokální systémy a SQL servery VY_32_INOVACE_7B10.
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.
ICT – Informační a komunikační technologie Ing. Libor Měsíček, Ph.D. CN460
Vzor na všechno. Vzor – úvod Problém .. Příklad: widgety .. Jak na to? .. Známý také jako...
Factory Method. Motivace – tisk Knihovna tiskne dokumenty do pdf File Open() Close() Print() PresentationWritingDrawing Knihovna tiskne obrázky do pdf.
OPERAČNÍ SYSTÉMY.
Katedra počítačů ČVUT FEL
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
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.
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ř.
Uživatelská rozhraní Cvičení 12a Martin Němec A
Uživatelská rozhraní Uživatelská rozhraní. knihovna Qt Trolltech (1994) v Oslu (Norsko) vytváří grafické uživatelské rozhraní (GUI) pro C++ multi-platformová.
Rezervační systém v prostředí XUL Zdeněk Novák, Petr Ondrejka.
Klient pro správu databází MySQL 1 Klient pro správu databází MySQL Zbyněk Munzar České vysoké učení technické v Praze Fakulta elektrotechnická.
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.
Uvedení autoři, není-li uvedeno jinak, jsou autory tohoto výukového materiálu a všech jeho částí. Tento projekt je spolufinancován ESF a státním rozpočtem.
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY MVC vs MVP.
Vývojová prostředí Objektově Orientované Programování OB21-OP-EL-KON-DOL-M Orbis pictus 21. století.
Vypracoval / Roman Málek
Návrhové vzory Filip Zavoral
Operační Systém Operační systém je v informatice základní programové vybavení počítače (tj. software), které je zavedeno do paměti počítače při jeho.
Vlastnosti souborů Jaroslava Černá.
Operační systémy - úvod
Návrhový vzor Flyweight
Abstract Factory.
Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek.
Informatika pro ekonomy přednáška 8
Bridge.
, Brno Jan Král Systém pro kontrolu uživatelské aktivity a jeho integrace do systému SMART fakulty.
C# přehled vlastností.
Decorator.
Monitor Object 1.
Composite “Spojuj a panuj”.
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

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 – Windows a OSX  skupiny obsahují stejnou sadu objektů  Windows i OSX obsahují nějaký objekt pro tlačítko, okno, scrollbar, …  jednotlivé objekty se chovají logicky stejně  na WinButton i OSXButton lze kliknout,... Chtěli bychom:  snadno vyměňovat a přidávat jednotlivé skupiny tříd  neduplikovat zbytečně kód pro objekty, které se chovají takřka stejně  odstínit uživatele od samotného vytváření objektů a jejich implementace  zajistit koherenci vytvářených objektů

Abstract Factory – idea práce Co s tím?  objekty budeme vytvářet pomocí továren ( WinGUIFactory, OSXGUIFactory, …)  uživatel nevolá new ale createSomeObject()  definujeme abstraktní továrnu – předek všech konkrétních továren  definujeme rozhraní pro vytvářené objekty  obecný typ Button, TextBox, ScrollBar, … Použití  zveřejníme pouze rozhraní továren a vytvářených objektů  na počátku si uživatel zvolí, kterou továrnu chce používat  a dále již pracuje pouze s rozhraními  podobně jako v případě knihoven funkcí

Abstract Factory – příklad Abstraktní produkty – rozhraní pro jednotlivé widgety Konkrétní produkty – implementace vzhledu pro „ScrollBar“ Abstraktní továrna – určuje rozhraní konkrétních továren Konkrétní továrny – implementují rozhraní abstraktní továrny Uživatel – pracuje pouze s rozhraními (tj. WidgetFactory, Window, ScrollBar)

Abstract Factory – příklad Abstraktní produkty – rozhraní pro jednotlivé widgety Konkrétní produkty – implementace vzhledu pro „TextBox“ Abstraktní továrna – určuje rozhraní konkrétních továren Konkrétní továrny – implementují rozhraní abstraktní továrny Uživatel pracuje pouze s rozhraními (tj. WidgetFactory, Button, TextBox) Konkrétní produkty – implementace vzhledu pro „Button“ Konkrétní továrny – implementují rozhraní abstraktní továrny

Abstract Factory – shrnutí účastníků Abstraktní produkty ( Button, TextBox )  rozhraní objektů vytvářených v továrně Abstraktní továrna ( GUIFactory )  rozhraní pro vytváření objektů  vrací „abstraktní“ objekty Aplikace/uživatel ( Application )  Pracuje pouze s abstraktními objekty, konkrétní jsou mu skryty Konkrétní produkty ( WinButton, WinTextBox, OSXButton, OSXTextBox )  skutečné objekty  implementují rozhraní jednotlivých abstraktních produktů Konkrétní továrny ( OSXGUIFactory, WinGUIFactory )  implementují rozhraní abstraktní továrny  vytváří skutečné (konkrétní) objekty

Abstract Factory – výhody a problémy Výhody  snadná změna skupiny tříd  stačí použít jinou konkrétní továrnu  zaručuje použití komponent z (pouze) jedné skupiny  WinButton + WinTextBox, OSXButton + OSXTextBox  vynucuje použití abstraktních rozhraní ( Button, TextBox )  jeden uživatelský kód pro všechny továrny Potenciální problémy  omezení funkčnosti  konkrétní produkty mohou podporovat pouze „průnik“ množin funkcí „základních“ objektů  přidávání nových skupin  pro každou novou skupinu je nutné implementovat všechny metody  řešení: abstraktní továrna nemusí být abstraktní  přidávání druhů objektů  nutná změna rozhraní a všech konkrétních továren  řešení: rozšiřitelná továrna

Abstract Factory – rozšiřitelná implementace Vlastnosti  pouze jedna metoda – parametr určuje produkt, který má být vytvořen  eliminuje nutnost změny rozhraní všech továren při přidání nového produktu  všechny produkty musí mít společného předka ( Widget )  ztrácíme typovou kontrolu!  používáno především v dynamicky typovaných jazycích, ve staticky typovaných se musí provádět přetypování na abstraktní produkt (obecné tlačítko, …) class GUIFactory { public: virtual Widget* Create(WidgetId id); }; Widget* GUIFactory::Create(WidgetId id) { switch (id) { /* generic widgets */ case BUTTON: return new Button(); case LABEL: return new Label(); default: return 0; } class OSXFactory: public GUIFactory { public: virtual Widget* Create(WidgetId id); }; Widget* OSXFactory::Create(WidgetId id) { switch (id) { case BUTTON: /* “override” */ return new OSXButton(); case TextBox: /* nový typ */ return new OSXTextBox(); default: /* “fallback” */ return GUIFactory::Create(id); }

Abstract Factory – dynamická implementace Vlastnosti  továrna spravuje mapování: identifikátor typu  vytvořující funkce  konkrétní typy vytvářených objektů se registrují jednotlivě za běhu  stačí jedna univerzální implementace továrny  použití – systémy, kde neznáme přesné typy při kompilaci class Factory { typedef AbstractProduct* (*ProductCreator)(); map mapping; public: bool Register(IdType id, ProductCreator creator) { return mapping.insert(make_pair(id, creator)).second; } bool Unregister(IdType id) { return mapping.erase(id) == 1; } AbstractProduct* CreateObject(IdType id) { auto it = mapping.find(id); if (it != mapping.end()) return (*it->second)(); return 0; } };

Abstract Factory – implementace pomocí prototypů Pouze jedna továrna obsahující prototypy  pro změnu typů vytvářených objektů stačí změnit prototypy v továrně  objekty vytvářeny klonováním prototypů speciální virtuální metodou  pomocí prototypů lze implementovat všechny tři uvedené typy továren class CloneFactory { Button *buttonPrototype; Window *windowProtototype; public: CloneFactory(Button *buttonProt, Window *windowProt): buttonPrototype(buttonProt), windowPrototype(windowProt) {} ~Factory() { delete buttonPrototype; delete windowProtototype; } Button* CreateButton() { return buttonPrototype->Clone(); } Window* CreateWindow() { return windowPrototype->Clone(); } };

Abstract Factory – bludiště Program stavící bludiště dostane MazeFactory jako parametr Příklad konkrétní abstraktní továrny  poskytuje defaultní implementaci class MazeFactory { public: // factory methods: virtual Maze* MakeMaze() const { return new Maze; } virtual Room* MakeRoom(int n) const { return new Room(n); } virtual Wall* MakeWall() const { return new Wall; } virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); } };

Abstract Factory – bludiště Potomci implementují specializace jednotlivých komponent Továrna zajišťuje konzistenci komponent  RoomWithABomb má kolem sebe BombedWalls class EnchantedMazeFactory: public MazeFactory { public: virtual Room* MakeRoom(int n) const { return new EnchantedRoom(n, CastSpell()); } virtual Door* MakeDoor(Room* r1, Room* r2) const { return new DoorNeedingSpell(r1, r2); } protected: Spell* CastSpell() const; }; class BombedMazeFactory: public MazeFactory { public: virtual Wall* MakeWall() const { return new BombedWall; } virtual Room* MakeRoom(int n) const { return new RoomWithABomb(n); } };

Abstract Factory – bludiště Maze* CreateMaze(MazeFactory *f) { Maze* aMaze = f->MakeMaze(); Room* r1 = f->MakeRoom(1); Room* r2 = f->MakeRoom(2); Door* d1 = f->MakeDoor(r1, r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North, f->MakeWall()); r1->SetSide(East, d1); r1->SetSide(South, f->MakeWall()); r1->SetSide(West, f->MakeWall());... return aMaze; } Maze* MazeGame::CreateMaze() { Maze* aMaze = new Maze; Room* r1 = new Room(1); Room* r2 = new Room(2); Door* d1 = new Door(r1, r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North, new Wall); r1->SetSide(East, d1); r1->SetSide(South, new Wall); r1->SetSide(West, new Wall);... return aMaze; } Tvorba bludiště s použitím továrny jako parametru. Řešení bez továrny.

Abstract Factory – použití v Java AWT AWT  Abstract Window Toolkit  každá AWT komponenta (Component) obsahuje odpovídající objekt daného systému (ComponentPeer) java.awt.Toolkit  AbstractFactory  potomci vrací příslušné objekty daného systému (MS Windows, X Window)  createMenu(), createButton(), …  getDefaultToolkit(), getToolkit() public static Toolkit getDefaultToolkit() { if (toolkit == null) { String nm = System.getProperty( "awt.toolkit", "sun.awt.motif.MToolkit"); toolkit = (Toolkit) Class.forName(nm). newInstance(); } return toolkit; }

Abstract Factory – další příklady použití Práce s databázemi  aplikace přistupující k různým databázím (MySQL, Oracle, …)  každá má trochu specifické rozhraní, ale základní operace jsou typicky stejné (connect, SQL dotaz, …)  nemusí se jednat pouze o klasické databáze, ale i jiná úložiště dat – např. XML  uživatel zavolá „factory->createConnection()“, dostane připojení ke správné databázi  továrna může spravovat i informace o umístění databáze, jednoduché rozkládání zátěže v případě více databázových serverů  uživatel si pouze řekne o OracleFactory a více „neřeší“ Přístup k filesystémům  chceme pracovat se soubory na různých filesystémech  interně se jejich implementace zásadně liší  na venek takřka totožné rozhraní (open, write, close, …)  abstraktní továrna zde působí jako poklička – uživatel neví, se kterým FS pracuje

Abstract Factory – další příklady použití Komunikace po síti  poklička nad protokoly na zvolené síťové vrstvě (typicky transportní)  může se starat např. i o zajišťování spolehlivosti nad UDP v situacích, kdy není vhodné použít TCP  využití více aplikačních protokolů ke stejnému účelu (http, WebDAV, ssh, nfs) Využití odlišných grafických prvků  multiplatformní uživatelské rozhraní  podpora Windows, Mac OS X i Linux Vývoj Abstract Factory  změny vůči původnímu návrhu v GoF  ovládaní kompletního lifecyklu včetně destrukce  využívání kombinace Builderu a Abstract Factory

Abstract Factory – shrnutí Definice abstraktní továrny  rozhraní pro vytváření rodin souvisejících nebo závislých objektů Význam použití  udržení úrovně abstrakce při návrhu API  koherence používaných implementací  správa destrukce objektů Jakou implementaci?  je třeba citlivě volit mezi flexibilitou a typovou kontrolou  ujasnit si, zda je horší sahat do uživatelského kódu nebo do všech konkrétních továren Související vzory  Factory Method – abstraktní továrna často používá tovární metody  Prototype – abstraktní továrna, může být implementována i pomocí prototypů  Builder – vzor používaný k vytváření objektů s podobným procesem inicializace  Singleton – typicky není třeba mít více než jednu továrnu

Dotazy? Abstract Factory

Zdroje E. Gamma, R. Helm, R. Johnson, J. Vlissides: Design Patterns - Elements of Reusable Object-Oriented Software (upraveno)