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



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

Abstract Factory úvod

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

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

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

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

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

Základy objektové orientace I. Únor 2010

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

Návrhové vzory OMO, LS 2014/2015

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

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

Generické programování

1. Dědičnost a polymorfismus

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

20. Projekt Domácí mediotéka

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

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

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

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

návrhový vzor Singleton.

Úvod do programovacích jazyků (Java)

Dědičnost (inheritance)

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

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

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

PREPROCESOR POKRAČOVÁNÍ

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

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.

typová konverze typová inference

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

Seminář Java IV p.1/38

Návrhový vzor Factory v JAVA API

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

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.

Java a XML. 10/26/09 1/7 Java a XML

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/

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

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

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

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

UJO Framework. revoluční architektura beans. verze

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

NA CO SI DÁT POZOR V JAVASCRIPTU? Angular.cz

Objektové programování

Jazyk C# (seminář 3)

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

Dědění, polymorfismus

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

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

Čipové karty Lekařská informatika

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

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

Chain of responsibility

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

PB161 Základy OOP. Tomáš Brukner

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

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

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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

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

1. Programování proti rozhraní

Abstraktní třída a rozhraní

Programování II. Polymorfismus

Polymorfismus. Porovnání jazyků z hlediska polymorfismu Jazyky C, C++, C# Jazyk Java PHP a jiné Na závěr souhrn vlastností jednotlivých jazyků

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

Vzor Továrna - Factory

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

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

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

RMI Remote Method Invocation

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

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Jazyk C++ I. Polymorfismus

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

Java a Caché IV: Manipulace s objekty

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

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

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

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

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

11. Dědičnost. Dědičnost strana 103

10 Generické implementace

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

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

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

Enterprise Java Beans 3.0

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

NSWI096 - INTERNET JavaScript

KTE / ZPE Informační technologie

Principy objektově orientovaného programování

Zpracoval:

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

Více o konstruktorech a destruktorech

9. Polymorfismus a rozhraní

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

Transkript:

Factory Method

Úvod - problém Mějme obchod s auty: public class OrderCars { public Car ordercar(string model) { Car car; Při přidání nového modelu je nutné upravit if(model.equals("mark IV")) car = new Mercury(model); else if(model.equals("corvette")) car = new Chevrolet(model); else if(model.equals("fusion")) car = new Ford(model); else if(model.equals("enzo")) car = new Ferrari(model); else if(model.equals("fabia")) car = new Skoda(model); car.buildcar(); car.testcar(); car.shipcar(); Kód, který se nebude často měnit Problém míchání relativně stálého kódu s kódem, který se bude měnit při každém přidání nové třídy Problém míchání úrovní abstrakce auto X Fabia

Řešení předchozího problému public abstract class CarFactory { abstract Car createcar(string model); Vytvoření objektu využívá polymorfismu public Car ordercar(string model) { Car car = createcar(model); car.buildcar(); car.testcar(); car.shipcar(); return car; Business logika public class FordFactory extends CarFactory { Car createcar(string model) { if(model.equals("fusion")) return new Ford(model); else if(model.equals("mark IV")) return new Mercury(model); else return null; Vytvoření frameworku pro objednávání aut Při přidání nového auta => pouze změna FordFactory.createCar

Známý jako Účel Factory Method Tovární metoda Virtual Constructor Definuje rozhraní pro vytvoření objektu Potomci sami rozhodují kterou třídu instanciovat Umožňuje odložit instanciaci z předka na potomka Kategorie Class Creational (Tvořivé návrhové vzory) Využití Vytváření frameworků Třída nezná objekty, které má vytvářet Potomci specifikují vytvářené objekty záleží na programátorech, kolik konkrétních potomků vytvoří Oddělení kódu, který se mění často, od neměnného

Struktura Factory Method - struktura Účastníci Product (Car) definuje rozhraní objektů vytvářených tovární metodou ConcreteProduct (Fabia) implementuje rozhraní Productu Creator (CarFactory) deklaruje tovární metodu vracející objekt typu Product může definovat defaultní implementaci vracející defaultní objekt ConcreteProduct ConcreteCreator (FordFactory) implementuje tovární metodu vracející instanci ConcreteProductu

Factory Method - paralelní hierarchie Propojení paralelních hierarchií tříd třída deleguje některé akce na jinou třídu příklad: manipulovatelné grafické objekty (úsečka, obdélník, kruh,...) stav manipulace je nutné udržovat pouze během manipulace - ne u grafického objektu manipulace různých objektů uchovávají jiný stav (koncový bod, rozteč řádků,...) objekt Manipulator, konkrétní grafické objekty mají vlastní manipulátory paralelní hierarchie Figure deklaruje CreateManipulator, potomci vytvářejí vlastní manipulátory částečně paralelní hierarchie - dědění defaultního manipulátoru

Factory Method - implementace Implementace dvě hlavní varianty Creator je abstraktní třída, nemá vlastní implementaci tovární metody nutnost dědičnosti a vlastní implementace Creator je konkrétní třída s defaultní implementací flexibilita pravidlo: Vytvářet objekty v separátní metodě => potomci mohou ovlivnit (polymorfismus), které třídy se budou instanciovat. parametrizované tovární metody variace - více druhů produktů tovární metoda dostane parametr identifikující druh objektu (ProdId) všechny objekty sdílejí rozhraní Productu class Creator { virtual Prod* Create(ProdId); ; Prod* Creator::Create (ProdId id) { if(id==mine) return new MyProd; if(id==yours) return new YourProd; return 0; Prod* MyCreator::Create (ProdId id) { if(id==mine) return new MyProd2; if(id==theirs) return new TheirProd; return Creator::Create(id); Obsluha ostatních id se deleguje na předka

Factory Method - implementace pozdní inicializace tovární metody jsou vždy virtuální, často čistě virtuální - pozor na volání z konstruktorů lazy initialization - přístup pouze přes přístupovou metodu (accessor) konstruktor Creatoru inicializuje ukazatel na 0 v případě potřeby se produkt vytvoří 'na žádost' class Creator { Product* GetProduct(); protected: virtual Product* CreateProduct(); private: Product* _product; ; Product* Creator::GetProduct () { if (_product == 0) { _product = CreateProduct(); return _product; accessor inicializace na žádost

Factory Method - implementace použití šablon někdy zbytečně pracné vytvářet konkrétní potomky šablona parametrizovaná Produktem není zapotřebí vytvářet potomky Creatora class Creator { virtual Product* CreateProduct() = 0; ; template <class T> class StdCreator: public Creator { virtual Product* CreateProduct(); ; template <class T> Product* StdCreator<T>::CreateProduct() { return new T; vrací konkrétního potomka abstraktního produktu class MyProduct : public Product { MyProduct(); //... ; StdCreator<MyProduct> mycreator;

Factory Method - bludiště CreateMaze má napevno použité třídy pro komponenty Factory Method umožní potomkům volbu komponent class MazeGame { Maze* CreateMaze(); // factory methods: Toto se bude měnit 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); ; Tovární metody vrací příslušnou komponentu MazeGame obsahuje defaultní implementace

Factory Method - bludiště Maze* MazeGame::CreateMaze () { Maze* amaze = MakeMaze(); Room* r1 = MakeRoom(1); Room* r2 = MakeRoom(2); Door* thedoor = MakeDoor(r1, r2); amaze->addroom(r1); amaze->addroom(r2); r1->setside(north, MakeWall()); r1->setside(east, thedoor); r1->setside(south, MakeWall()); r1->setside(west, MakeWall()); r2->setside... return amaze; class BombedMazeGame : public MazeGame { BombedMazeGame(); virtual Wall* MakeWall() const { return new BombedWall; virtual Room* MakeRoom(int n) const { return new RoomWithABomb(n); ; potomci implementují specializace různých komponent class EnchantedMazeGame : public MazeGame { EnchantedMazeGame(); 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; ;

Factory Method příklady použití Qt gui framework (C++) virtual Qmenu* QmainWindow::createPopupMenu() Java API XML parsery, DateFormat třída DocumentBuilderFactory, DocumentBuilder SAXParserFactory, SAXParser Factory method DateFormat df1 = DateFormat.getDateInstance(DateFormat.FULL, Locale.FRANCE); Zend webový aplikační framework (PHP) Třída Zend_Db connector k různým typům databází // require_once 'Zend/Db/Adapter/Pdo/Mysql.php'; // Automatically load class Zend_Db_Adapter_Pdo_Mysql // and create an instance of it. $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test' )); Factory method Pdo_Sqlite, Pdo_Mssql, Oracle, DB2,...

Factory Method příklady použití public static function factory($adapter, $config = array()) { // obtaining adapter class name $adaptername = strtolower($adapternamespace. '_'. $adapter); // Load the adapter class. This throws an exception // if the specified class cannot be loaded. @Zend_Loader::loadClass($adapterName); Factory method // Create an instance of the adapter class. // Pass the config to the adapter class constructor. $dbadapter = new $adaptername($config); Concrete Product // Verify that the object created is // a descendent of the abstract adapter type. if (! $dbadapter instanceof Zend_Db_Adapter_Abstract) { // throwing Zend_Db_Exception require_once 'Zend/Db/Exception.php'; test of Product base class throw new Zend_Db_Exception("Adapter class '$adaptername' does not extend Zend_Db_Adapter_Abstract"); return $dbadapter;

Shrnutí Factory Method flexibilita za relativně malou cenu obvyklá základní metoda zvýšení flexibility virtual constructor časté využití jinými vzory - související návrhové vzory Abstract Factory často implementovaná pomocí továrních metod Template Method často volány tovární metody Prototype nevyžaduje dědění Creatora... avšak vyžaduje navíc inicializaci produktové třídy