Abstract Factory.

Slides:



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

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.
Inf Používání a tvorba databází. Výukový materiál Číslo projektu: CZ.1.07/1.5.00/ Šablona: III/2 Inovace a zkvalitnění výuky prostřednictvím ICT.
Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Josef Ledvoň. Dostupné z Metodického portálu ISSN: , financovaného.
Přecházíme na WordPress Hynek Beran Správa ICT město Hořice
Delphi – práce se základními komponentami (1. hodina) OB21-OP-EL-KON-DOL-M-4-008A Orbis pictus 21. století.
Úvod do Delphi - 1.hodina OB21-OP-EL-KON-DOL-M-4-006A Orbis pictus 21. století.
RŮZNOST KANCELÁŘSKÝCH BALÍKŮ je řada za sebou následujících snímků (slidů) předváděných na PREZENTACE monitoru počítače plátně prostřednictvím dataprojektoru.
Programování v jazyce C++ Dědičnost a polymorfismus.
Čí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.
Síťové operační systémy OB21-OP-EL-KON-DOL-M Orbis pictus 21. století.
Facade [f ə ˈ s ɑː d]f ə ˈ s ɑː d. Facade Před: Po:
Databáze © Mgr. Petr Loskot
Úvod do databází MS Access (1).
Microsoft Excel verze 2010 Mgr. Přemysl Kejzlar.
Věcné autority v roce 2016
Spuštění programu (10).
Účetnictví a výkaznictví
Výukový materiál zpracován v rámci projektu
Internet.
Interpolace funkčních závislostí
COM – Práce s objektovým modelem jiné aplikace
Operační systémy Soubory a adresáře
Lineární funkce - příklady
ČÍSLO PROJEKTU CZ.1.07/1.5.00/ ČÍSLO MATERIÁLU 1 – Množiny – teorie
Soustava dvou lineárních rovnic se dvěma neznámými
State 1.
Architektura UIS Bc. Tomáš Procházka Sekce jádra systému Vývojový tým Univerzitního informačního systému Mendelova zemědělská a lesnická univerzita v.
Programování v jazyce C++
TIPY A RADY PRO PRÁCI S DATABÁZÍ SCOPUS
Excel – tabulkový procesor
Jednotné principy klasifikace na GJKT
Digitální učební materiál zpracovaný v rámci projektu
Název školy: ZŠ Bor, okres Tachov, příspěvková organizace
JEdit Open source programování – – Marek Bílý.
Název školy Základní škola Šumvald, okres Olomouc Číslo projektu
Databáze MS ACCESS 2010.
Configuration Patterns
Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,
1. Jak si rychle a jednoduše upravit vzor
Formální úprava rešerše
Soustava dvou lineárních rovnic se dvěma neznámými
Bridge.
Stavební fakulta ČVUT, B407
Informatika pro ekonomy přednáška 8
NÁZEV ŠKOLY: Základní škola Josefa Bublíka, Bánov
NÁZEV ŠKOLY: Základní škola Josefa Bublíka, Bánov
NÁZEV ŠKOLY: Základní škola Josefa Bublíka, Bánov
Jak postupovat při měření?
NÁZEV ŠKOLY: Základní škola Josefa Bublíka, Bánov
VY_32_INOVACE_6_5_Operační systémy
Microsoft Office Access
Typy Oken, Zobrazení a Konfigurace
Visitor 1 1.
MISYS - Pasporty.
Materiál byl vytvořen v rámci projektu
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.“
VY_32_INOVACE_VJ36.
Platforma pro personalizaci standardizovaných výukových materiálů
Tereza Bížová Představení se.
Množství, symbol Základní matematické, početní a číselné pojmy a operace Řešení problémů, učení Jemná motorika, koordinace ruky a oka.
Analýza informačního systému
Informatika pro ekonomy přednáška 8
Lineární funkce a její vlastnosti
Grafy kvadratických funkcí
Hromadné dokumenty opakující se pro kolekci osob
Adapter
Bridge.
Union neboli sjednocení Bitová pole
Futurama, A Pharoh to Remember, © Comedy Partners
Transkript prezentace:

Abstract Factory

Motivace (problém) Problém programujeme grafickou knihovnu pro tvorbu aplikací požadavky přenositelnost nativní vzhled pro daný OS

Motivace (problém) Cíl Jak toho dosáhneme? minimální duplikace kódu uživatele snadno přidat/odebrat/vyměnit objekt odstínit uživatele od implementace objektů Jak toho dosáhneme? Abstract Factory!

Motivace (problém) Řešení Uživatel pracuje pouze s rozhraními (tj. GUIFactory, Button, TextBox) Řešení Rozhraní pro objekty Abstraktní továrna – určuje rozhraní konkrétních továren Konkrétní objekty –implementace vzhledu pro „Button“ Konkrétní továrny – implementují rozhraní abstraktní továrny Konkrétní objekty –implementace vzhledu pro „TextBox“

Důsledek Abstract Factory Rozhraní AbstractFactory samo vynucuje závislosti mezi konkrétnimi objekty např.: tlačítko pro OSX můžeme použít pouze s text boxem pro OSX

Kdy použít Cheme nezávislost na tom, jak objekty tvoříme, skládáme a reprezentujeme Chceme vynutit, aby skupina souvisejících objektů byla používaná společně Chceme zpřístupnit pouze rozhraní objektů, ne implementaci

Implementace Programujeme hru jako je Doom Dvě různé obtížnosti – dvě skupiny nepřátel Enemy Soldier Monster SuperMonster EasySoldier HardSoldier EasyMonster HardMonster EasySuperMonster HardSuperMonster Jedna úrověň – jedna skupina nepřátel (Easy/Hard) chceme vynutit – Abstract Factory!

Implementace Hlavní továrna class AbstractEnemyFactory { public: virtual ~AbstractEnemyFactory() { } virtual Soldier* MakeSoldier() = 0; virtual Monster* MakeMonster() = 0; virtual SuperMonster* MakeSuperMonster() = 0; };

Implementace Konkrétní továrny pro každou skupina nepřátel (Easy, Hard) class EasyLevelEnemyFactory : public AbstractEnemyFactory { public: Soldier* MakeSoldier() { return new EasySoldier; } Monster* MakeMonster() { return new EasyMonster; } SuperMonster* MakeSuperMonster() { return new EasySuperMonster; } }; class HardLevelEnemyFactory : public AbstractEnemyFactory { public: Soldier* MakeSoldier() { return new HardSoldier; } Monster* MakeMonster() { return new HardMonster; } SuperMonster* MakeSuperMonster() { return new HardSuperMonster; } };

Implementace Rozhraní pro nepřátele class Soldier { public: virtual ~Soldier() { } virtual void SoldierAttack() = 0; }; class Monster { public: virtual ~Monster() { } virtual void MonsterAttack() = 0; }; class SuperMonster { public: virtual ~SuperMonster() { } virtual void SuperMonsterAttack() = 0; };

Implementace Konkrétní nepřátele class EasySoldier : public Soldier { void SoldierAttack() { /* Easy soldier attack */ } }; class EasyMonster : public Monster { public: void MonsterAttack() { /* Easy monster attack */ } }; class EasySuperMonster : public SuperMonster { public: void SuperMonsterAttack() { /* Easy super monster attack */ } };

Implementace Zvenčí class GameApp { ... void SelectLevel() if (user chooses the Easy level) factory_ = new EasyLevelEnemyFactory; } else factory_ = new HardLevelEnemyFactory; private: AbstractEnemyFactory* factory_; };

Výhody Izolace konkrétních tříd uživatel pracuje s abstraktním předkem jména konkrétních objektů se v uživatelově kódu neobjeví větší kontrola nad implementací Snadná změna skupin objektů (z pohledu uživatele) konkrétní továrna v kódu pouze jednou stačí vyměnit konkrétní továrnu Vynucuje konzistenci v rámci objektů chceme-li, aby skupina objektů fungovala pouze společně

Nevýhody Přidání nové skupiny objektů Přidání nových druhů objektů nutno přidat celou novou konkrétní továrnu Přidání nových druhů objektů nutno upravit AbstractFactory a všechny konkrétní továrny Menší flexibilita konkrétní objekty mohou podporovat pouze průnik množin funkcí objektů

Přidání nových druhů objektů - řešení Rozšiřitelná továrna Místo jednotlivých metod pro vytvoření každého objektu pouze jedna metoda – Make() Jaký objekt chceme vytvořit určíme přes parametr metody Lze použít pouze pokud všechny objekty mají stejného abstraktního předka! ztráta typové kontroly Nový druh objektu = změníme metodu Make()

Přidání nových druhů objektů - řešení class AbstractEnemyFactory { public: virtual ~AbstractEnemyFactory() { } virtual Enemy* Make(EnemyType type) = 0; }; class EasyLevelEnemyFactory : public AbstractEnemyFactory { public: Enemy* Make(EnemyType type) { switch(type) { case SOLDIER: return new EasySoldier; case MONSTER: return new EasyMonster; case SUPER_MONSTER: return new EasySuperMonster; default: } };

Konkrétní použití Java AWT java.awt.toolkit 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()

Další použití Databáze Filesystémy Odlišné grafické prvky různé databáze – MySQL, Oracle, XML, .... základní operace zůstavají stejné (SQL dotaz, connect, ...) uživatel komunikuje s databází přes továrnu Filesystémy různé filesystémy, odlišné implementace navenek jsou jejich operaci skoro identické open, write, close, makedir, ... Odlišné grafické prvky multiplatformní aplikace chceme nativní vzhled

Související vzory Factory Method Prototype Singleton objekt AbstractFactory v sobě má tovární metody pro vytvoření každého objektu konkrétní továrny tyto metody předefinovávají Prototype místo konkrétních továren pro každou skupinu objektů jedna CloneFactory chceme nový objekt – klonujeme prototyp Singleton konkrétní továrna často existuje v celém programu pouze jednou