Factory Method. Motivace – tisk Knihovna tiskne dokumenty do pdf File Open() Close() Print() PresentationWritingDrawing Knihovna tiskne obrázky do pdf.

Slides:



Advertisements
Podobné prezentace
(instance konkrétní třídy)
Advertisements

Vývoj aplikací s využitím JavaFX
Ing. Jan Mittner MySQL Workbench 2. Základy práce s databází 3. Subversion 2.
Proxy. Definice  zástupce nebo náhradník za dotyčný objekt  proxy i zastoupený objekt dědí od stejného interfacu  proxy kontroluje přístup k objektu.
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Singleton 1 1.
Polymorfismus Dědičnost
Databázové systémy II Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
● SWIG - Simplified Wrapper and Interface Generator ● + google a diskusní fóra ● nástroj zjednodušující (a sjednocující)
Čtvrté cvičení Objektové programování Objektový model v Javě
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
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
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové programování
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Facade [f ə ˈ s ɑː d]f ə ˈ s ɑː d. Facade Před: Po:
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
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
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
PB161 Principy OOP - rozhraní, dědičnost PB161 | Principy OOP - Dědičnost, rozhraní
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
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.
Richard Lipka Department of Computer Science and Engineering Faculty of Applied Sciences University of West Bohemia, Pilsen, Czech Republic 1.
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
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.
Vzor na všechno. Vzor – úvod Problém .. Příklad: widgety .. Jak na to? .. Známý také jako...
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.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Pokročilé programování v C++ (část B)
Foreign key mapping Jakub Chalupa Naim Ashhab Č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.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Visitor. Visitor - motivace Existující struktura typů Unit Character Main Hero Monster Environment Wall Magic Wall Stone Tree Mnoho nezávislých operací.
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.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
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ř.
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.
Composite “ Spojuj a panuj ”. Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž.
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
Úvod do C# - OOP Jaroslav BURDYS 4IT.
školák Piš a sdílej své sešity, jednoduše, rychle, v pohodě.
Návrhový vzor Flyweight
R nejen v SQL Serveru Jiří Neoral BI Data Architect
Abstract Factory.
TNPW1 JavaScript Ing. Jiří Štěpánek.
Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.
Bridge.
Reflexe jako introspekce
C# přehled vlastností.
Monitor Object 1.
Proxy 1.
Adapter
Composite “Spojuj a panuj”.
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

Factory Method

Motivace – tisk Knihovna tiskne dokumenty do pdf File Open() Close() Print() PresentationWritingDrawing Knihovna tiskne obrázky do pdf JPEGGIFBMPFile Open() Close() Print()

public class Printer { public File printToPDF(String path) { File file; file = new Presentation, Writing or Drawing? file.Load(); file.Print(); file.Close(); return file; } Motivace – tisk Jak získáme tu správnou třídu k instanciování? Jak implementovat metodu printToPDF? Rozhodujeme se na základě přípony souboru

public class Printer { public File printToPDF(String path) { File file; if(ext(path) == "ppt") file = new Presentation(path); else if(ext(path) == "doc") file = new Writing(path); else if(ext(path) == "drw") file = new Drawing(path); file.Load(); file.Print(); file.Close(); return file; } Rychlé řešení Komplikace  Tisk obrázků místo dokumentů  Možné duplicity kódu  Přidání nového typu dokumentu (např. Excel) Rozhodnutí přímo v těle metody Potřebuje metoda znát potomky třídy File? Co když přidáme novou třídu Excel?

public class Printer { public abstract File CreateFile(string path); public void printToPDF(String path) { File file = this.CreateFile(path); file.Load(); file.Print(); file.Close(); } Factory Method – řešení public class ImagePrinter : Printer { public override File CreateFile(string path) { if(ext(path) == "jpeg") return new Jpeg(path); else if(ext(path) == "gif") return new Gif(path); return null; } public class DocumentPrinter : Printer { public override File CreateFile(string path) { if(ext(path) == "ppt") return new Presentation(path); else if(ext(path) == "doc") return new Writing(path); return null; } Knihovna pro tisk dokumentů Knihovna pro tisk obrázků Výhoda - zapouzdření

public class Printer { public abstract File CreateFile(string path); public void printToPDF(String path) { File file = this.CreateFile(path); file.Load(); file.Print(); file.Close(); } Factory Method – řešení 2.0 public class ImagePrinter : Printer { public override File CreateFile(string path) { if(ext(path) == "jpeg") return new Jpeg(path); else if(ext(path) == "gif") return new Gif(path); return base.CreateFile(path); } public class DocumentPrinter : Printer { public override File CreateFile(string path) { if(ext(path) == "ppt") return new Presentation(path); else if(ext(path) == "doc") return new Writing(path); return base.CreateFile(path); } Knihovna pro tisk dokumentů Knihovna pro tisk obrázků

Motivace 2 – hra public class Game { public Room GenerateRoom() { Room room = new Room(); room.add(new Door()); int monsters = random(0,5); for(int i = 0; i < monsters; ++i) { room.add(new Monster()); } Metoda generuje místnosti ve hře Chceme přidat novou třídu AdvancedMonster  Jak ji integrovat do hry?

Factory Method – řešení public class Game { public virtual Room CreateRoom() { return new Room(); } public virtual Door CreateDoor() { return new Door(); } public virtual Monster CreateMonster() { return new Monster(); } public Room GenerateRoom() { Room room = this.CreateRoom(); room.add(this.CreateDoor()); int monsters = random(0,5); for(int i = 0; i < monsters; ++i) { room.add(this.CreateMonster()); } return room; } Delegujeme instanciování na dedikované metody public class HardGame : Game { public override Monster CreateMonster() { return new AdvancedMonster(); }

Struktura Účastníci  Product ( File ) definuje rozhraní objektů vytvářených tovární metodou  ConcreteProduct ( Presentation ) implementuje rozhraní Productu  Creator ( Printer ) deklaruje tovární metodu vracející objekt typu Product může definovat defaultní implementaci vracející defaultní objekt ConcreteProduct  ConcreteCreator ( DocumentPrinter ) implementuje tovární metodu vracející instanci ConcreteProductu Factory Method – struktura

Factory Method – přehled Známý jako  Tovární metoda nebo Virtual Constructor Kategorie  Creational design patterns Účel  Definuje rozhraní pro vytvoření objektu  Odložení instanciace na potomka  Potomci sami rozhodují, kterou třídu instanciovat Obecné podmínky  Třída nezná konkrétní potomky  Delegace instanciace na jedno místo + zapouzdření  Potřeba lifetime managementu na centrálním místě Praktické situace  Framework pro více využití => Document, Image  Nahrazení využívaných tříd jejich potomky => AdvancedMonster  Rozšíření aplikace o nové třídy => Excel, HillSlotCarPiece  Testování

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,...) stav manipulace udržován pouze během manipulace - ne u grafického objektu manipulace různých objektů uchovávají různý stav (koncový bod, rozteč řádků,...) objekt Manipulator, konkrétní grafické objekty mají vlastní manipulátory Figure deklaruje CreateManipulator, potomci vytvářejí vlastní manipulátory částečně paralelní hierarchie - dědění defaultního manipulátoru Factory Method – paralelní hierarchie

Factory Method – static factory method public class Complex { public double real; public double imaginary; public static Complex FromCartesian(double real, double imaginary) { return new Complex(real, imaginary); } public static Complex FromPolar(double modulus, double angle) { return new Complex(modulus * Cos(angle), modulus * Sin(angle)); } private Complex(double real, double imaginary) { this.real = real; this.imaginary = imaginary; } Když už není možné přetížit konstruktory Nevýhody  Bez privátních nebo protected konstruktorů nelze vytvářet potomky Creatora Výhody  Není nutné vždy vytvářet novou instanci  Lze vracet jakéhokoliv potomka

Factory Method – testování Komunikační framework  třída Client  potomek DangerousClient Automatické testování bezpečnosti  potřeba automaticky podstrčit třídu DangerousClient Řešení  vzor Factory Method pro třídu Client

Factory Method – implementace Implementace  dvě hlavní varianty Creator je abstraktní třída (nebo interface)  nutnost dědičnosti a vlastní implementace Creator je standardní třída => defaultní implementace  flexibilita  parametrizované tovární metody variace - více druhů produktů metoda dostane parametr identifikující druh objektu (ProdId) všechny objekty sdílejí jedno rozhraní - Product class Creator { public: 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  použití šablon někdy zbytečné vytvářet další potomky šablona parametrizovaná Produktem není zapotřebí vytvářet potomky class Creator { public: virtual Product* CreateProduct() = 0; }; template class StdCreator: public Creator { public: virtual Product* CreateProduct(); }; template Product* StdCreator ::CreateProduct() { return new T; } class MyProduct : public Product { public: MyProduct(); //... }; StdCreator myCreator; vrací konkrétního potomka abstraktního produktu

Factory Method – příklady použití virtual Qmenu* QmainWindow::createPopupMenu() Qt gui framework (C++) Java API – XML parsery, DateFormat třída  DocumentBuilderFactory, DocumentBuilder  SAXParserFactory, SAXParser 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' => ' ', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test' )); Factory method Pdo_Sqlite, Pdo_Mssql, Oracle, DB2,... DateFormat df1 = DateFormat.getDateInstance(DateFormat.FULL, Locale.FRANCE); Factory method

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 // Create an instance of the adapter class. // Pass the config to the adapter class constructor. $dbAdapter = new $adapterName($config); // 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'; throw new Zend_Db_Exception("Adapter class '$adapterName' does not “ “extend Zend_Db_Adapter_Abstract"); } return $dbAdapter; } Factory method Concrete Product test of Product base class

Factory Method – výhody a nevýhody Výhody  Oddělení vrstev Odstraní nutnost používat aplikačně-specifické třídy Možnost definovat vlastní ConcreteProduct  Propojení paralelních tříd Jasně určí, které třídy patří k sobě Nevýhody  Nutnost vytvořit potomka Vytváření potomka Creator pouze kvůli instanci ConcreteProduct Nevadí pokud klient musí vždy vytvořit potomka

Factory Method - související návrhové vzory Shrnutí  flexibilita za relativně malou cenu  obvyklá základní metoda zvýšení flexibility virtual constructor  časté využití jinými 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 (např. Clone())