Abstract Factory úvod

Podobné dokumenty
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:

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

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

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

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

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

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

Chain of responsibility

Dědění, polymorfismus

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

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

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

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Návrhové vzory OMO, LS 2014/2015

PREPROCESOR POKRAČOVÁNÍ

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

Aplikace s grafickým uživatelským rozhraním

Generické programování

typová konverze typová inference

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...

Jazyk C# (seminář 3)

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

Abstraktní třídy, polymorfní struktury

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.

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

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

Výčtový typ strana 67

PŘETĚŽOVÁNÍ OPERÁTORŮ

Programování II. Polymorfismus

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

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

návrhový vzor Singleton.

Programování II. Návrh programu II

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Základy objektové orientace I. Únor 2010

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

Dědičnost (inheritance)

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

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

Programování v C++ 2, 8. 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

Jazyk C++ I. Polymorfismus

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

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

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

20. Projekt Domácí mediotéka

Zpracoval:

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

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

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

Motivační příklad reálný svět. výroba (assembly line)

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Návrhový vzor Factory v JAVA API

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

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

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

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

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

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

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

TÉMATICKÝ OKRUH Softwarové inženýrství

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

Teoretické minimum z PJV

Jazyk C# (seminář 6)

Seminář Java IV p.1/38

GWT pro pokročilé. MoroSystems, s.r.o. Pavel Klobása. Senior Java Developer.

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

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

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

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

Abstraktní třída a rozhraní

Vzor Továrna - Factory

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.

RMI Remote Method Invocation

Jazyk C++ I. Polymorfismus

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

Úvod do programovacích jazyků (Java)

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

PB161 Základy OOP. Tomáš Brukner

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

Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.

Komponenty v.net. Obsah přednášky

Programátorská příručka

IRAE 07/08 Přednáška č. 7. Začátek (head)

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

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

1. Dědičnost a polymorfismus

Objektové programování

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

Zápis programu v jazyce C#

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Jazyk C++ I. Šablony 3

Transkript:

Abstract Factory

Abstract Factory úvod Problém potřebujeme vytvářet objekty ze skupiny souvisejících tříd skupin je více, chceme je snadno vyměňovat můžeme používat (v jednom kontextu) pouze jednu skupinu konzistence Příklad: widgety toolkit pro vytváření GUI s různými look and feel WidgetFactory vytváří okna, tlačítka, konkrétní skupina do které objekt patří není důležitá (PMButton vs. MotifButton) pozn: PM = Presentation Manager GUI v systému OS/2 Jak na to? izolovat aplikaci od konkrétních typů - zbavit se operátoru new vytvářet objekty pouze pomocí továrny možnost kontroly z jednoho místa využít polymorfismus přístup k továrně přes abstraktní rozhraní Známý také jako Kit

Abstract Factory příklad Abstraktní továrna Rozhraní pro jednotlivé widgety Konkrétní továrny Implementace vzhledu pro ScrollBar

Abstract Factory účastníci Abstraktní produkty (Window, ScrollBar) rozhraní objektů vytvářených v továrně viditelné pro aplikaci Abstraktní továrna (WidgetFactory) rozhraní pro vytváření objektů vrací abstraktní objekty viditelné pro aplikaci Klient používá jenom rozhraní abstraktních produktů a továrny Konkrétní produkty (MotifWindow, MotifScrollBar) skutečné objekty, neviditelné pro aplikaci implementují rozhraní jednotlivých abstraktních produktů Konkrétní továrny (MotifWidgetFactory, PMWidgetFactory) vytváří skutečné objekty, neviditelné pro aplikaci implementují rozhraní abstraktní továrny

Abstract Factory Factory Method implementace Snadná změna skupiny tříd stačí použít jinou konkrétní továrnu jen změna inicializace abstraktní továrny Továrna jako singleton nemá smysl více než jedna instance každé konkrétní továrny typicky chceme pouze jednu továrnu v celé aplikaci (kvůli konzistenci) Přidávání skupin pro každou novou skupinu je nutné implementovat všechny metody varianta: továrna není abstraktní poskytuje defaultní implementace 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 stačí jedna metoda - její parametr identifikuje objekt, který má být vytvořen všechny objekty musí mít společného předka eliminuje nutnost změny rozhraní továren při přidání nového druhu objektu nevýhoda: ztrácíme část typové kontroly, klient musí provádět přetypování jak volit typové identifikátory? class GUIFactory { virtual Widget* Create(WidgetId id); ; Widget* GUIFactory::Create(WidgetId id) { switch (id) { case BUTTON: return new Button(); case TEXTBOX: return new TextBox(); default: return 0; class NewFactory: public GUIFactory { virtual Widget* Create(WidgetId id); ; Widget* NewFactory::Create(WidgetId id) { switch (id) { case BUTTON: return new NewButton(); case SLIDER: return new Slider(); default: return GUIFactory::Create(id);

Abstract Factory dynamická implementace Vlastnosti továrna spravuje mapování: identifikátor typu vytvářející funkce konkrétní typy vytvářených objektů se registrují jednotlivě za běhu stačí jedna univerzální implementace továrny má širší použití systémy kde neznáme přesné typy při kompilaci class Factory { typedef AbstractProduct* (*)() ProductCreator; AssocMap<IdType,ProductCreator> mapping; bool Register(IdType id,productcreator creator) { AssocMap::value_type toinsert(id, creator); return mapping.insert(toinsert).second; bool Unregister(IdType id) { return mapping.erase(id) == 1; AbstractProduct* CreateObject(IdType id) { AssocMap::const_iterator 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; 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 MazeFactory je abstraktní a zároveň konkrétní továrnou class MazeFactory { // 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ána zajišťuje konzistenci komponent RoomWithABomb má kolem sebe BombedWalls class BombedMazeFactory: public MazeFactory { virtual Wall* MakeWall() const { return new BombedWall; virtual Room* MakeRoom(int n) const { return new RoomWithABomb(n); ; class EnchantedMazeFactory: public MazeFactory { 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; ;

Abstract Factory bludiště objekty vytváří továrna názvy objektů natvrdo 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;

Abstract Factory použití v 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 shrnutí Definice abstraktní továrny rozhraní pro vytváření rodin souvisejících nebo závislých objektů Jakou implementaci? je třeba volit mezi flexibilitou a type safety někdy omezené možnosti například nemůžeme zasahovat do kódu vytvářených objektů záleží na konkrétním použití Související vzory Factory Method - abstraktní továrna často používá tovární metody Prototype - abstraktní továrna může být implemetovaná i pomocí prototypů Singleton - je vhodné, aby továrna byla singleton