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

Podobné dokumenty
Návrhové vzory OMO, LS 2014/2015

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

20. Projekt Domácí mediotéka

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

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

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

Programování v Javě I. Únor 2009

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

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Programování v Javě I. Leden 2008

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

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

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

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

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

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

UJO Framework. revoluční architektura beans. verze

návrhový vzor Singleton.

Seminář Java IV p.1/38

Jazyk C# (seminář 3)

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

Teoretické minimum z PJV

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

Principy objektově orientovaného programování

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

Abstraktní třída a rozhraní

Generické programování

Návrhové vzory Design Patterns

Základy objektové orientace I. Únor 2010

Abstraktní datové typy: zásobník

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

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

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

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

Typický prvek kolekce pro české řazení

KTE / ZPE Informační technologie

Vzor Továrna - Factory

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

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

Java Enum Java, zimní semestr ,2017 1

Algoritmizace a programování

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

PREPROCESOR POKRAČOVÁNÍ

Jazyk C# (seminář 6)

Úvod do programovacích jazyků (Java)

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

typová konverze typová inference

Abstract Factory úvod

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

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

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

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

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

Čipové karty Lekařská informatika

Ú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:

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

Vláknové programování část V

1. Téma 12 - Textové soubory a výjimky

Seminář Java II p.1/43

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

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

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

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

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

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/

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

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.

Dědění, polymorfismus

1. Dědičnost a polymorfismus

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

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

3. Třídy. Základní pojmy objektového programování. Třídy

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

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

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

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

RMI Remote Method Invocation

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

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Java - výjimky. private void vstup() throws IOException {... }

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Chain of responsibility

Modularita. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

1. Programování proti rozhraní

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

Java Výjimky Java, zimní semestr

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Základy Guice Vazby Scopes. Google Guice. základní seznámení s frameworkem Google Guice

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

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

Vytváření a použití knihoven tříd

Java - řazení objektů

Iterator & for cyklus

Objektově orientované programování

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

Transkript:

OMO 4 - Creational design patterns A Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC Ing. David Kadleček, PhD. kadlecd@fel.cvut.cz, david.kadlecek@cz.ibm.com 1

Creational design patterns = chytřejší konstruktory, které: skrývají komplexitu vytváření objektů předepisují typy objektů/metod, které musí potomci třídy, vytvářet/implementovat zaručují, že se vytvoří pouze jedna instance vytváří přesné kopie objektů (včetně všech atributů a navázaných tříd) Zapůjčují již vytvořené objekty, místo neustálého vytváření nových A jsou to: Singleton Simple Factory Abstract Factory Factory Method Prototype Builder IoC 2

Singleton Singleton se používá jestliže chceme, aby od jedné třídy existovala maximálně jedna implementace. Používá se např. Pro načítání konfigurace, drivery pro ovládání zařízení, logging atd. Obecně se doporučuje vyhnout se jeho používání,protože se jedná o synchronizovanou globální proměnnou, která je jednak mutable a také je zdrojem blokování threadů při větší zátěži class ClassSingleton { private static ClassSingleton INSTANCE; private String info = "Initial info class"; private ClassSingleton() { public synchronized static ClassSingleton getinstance(){ if (INSTANCE == null) { INSTANCE = new ClassSingleton(); Pozn. bez synchronized nefunguje v multithreaded aplikaci return INSTANCE; // getters and setters 3

Simple Factory Vytváření objektů konkrétního typu je zapouzdřené do metod ve specializované třídě. Uživatel třídy je odstíněn od komplexity vytváření objektů. class PlantFactory { public Apple makeapple(int size, Boolean hasgoodtaste) { // Code for creating an Apple here. public Orange makeorange(int size) { // Code for creating an orange here.... PlantFactory plantfactory = new PlantFactory() Apple bigtastyapple = plantfactory.makeapple(10, true) Apple smalluglyapple = plantfactory.makeapple(2, false) Orange orange = plantfactory.makeorange(5) Q: Jaká je výhoda proti jednoduchému konstruktoru? A: Factory můžu poskytout dalším vývojářům jako API na vytváření ovoce. Factory vymezuje: (i) všechny typy ovoce, co chci vyrábět, (ii) přes jaké metody umožňuji jejich vytváření. Dále pak do Factory můžu zapracovat aspekty jako např. Kolik ovoce jsem vyrobil, centrální logování výroby atd. 4

Factory Method Factory Method se používá za účelem vytvoření objektu pokud nechceme specifikovat konkrétní třídu objektu, který je vytvářen. Místo konstruktoru objektu se volá faktory metoda, která je implementována/nebo redefinována v potomkovi. 5

Factory Method Druh objektu i jeho počáteční vlastnosti jsou dané přijatými parametry, případně i stavem objektu, který tovární metodu poskytuje. Používá se tam, kde je vytvářený objekt nějakým způsobem odvozený od aktuální instance třídy, která Factory Method poskytuje. Tyto metody se používají hlavně u immutable tříd. abstract class FruitCreator { protected abstract Fruit makefruit(int size); public void pickfruit() { private final Fruit f = makefruit(); class OrangeCreator extends FruitCreator { @Override protected Fruit makefruit(int size){ if (size > 5) return new BigOrange(); else return new SmallOrange(); FruitCreator fruitcreator = new FruitCreator(); Fruit orange = fruitcreator.makefruit(4) //returns SmallOrange instance 6

Abstract Factory Abstract Factory je abstraktním rozšířením Simple Factory, když chceme vytvářet celou rodinu objektů, ale v různých variantách. Z Factory Method se zase přebírá to, že není třeba přesně specifikovat produkt, který vytváříme, ale pouze předepisujeme jaké typy objektů se mají vytvářet. Příkladem je grupa Volkswagen, která sdílí komponenty a postupy přes své dceřiné společnosti. Existuje GroupAbstractFactory, která předepisuje co se má vyrábět v přes jaké rozhraní. Od ní jsou odděděné AudiFactory, SkodaFactory, VolkswagenFactory... 7

Vytváření produktů: Produkty: interface PlantFactory { Plant makeplant(); Picker makepicker(); public class AppleFactory implements PlantFactory { Plant makeplant() { return new Apple(); Picker makepicker() { return new ApplePicker(); public class OrangeFactory implements PlantFactory { Plant makeplant() { return new Orange(); Picker makepicker() { return new OrangePicker(); abstract class Plant {... class Apple extends Plant { class Orange extends Plant { abstract class Picker {... abstract class ApplePicker extends Picker {... Client: PlantFactory applefactory = new AppleFactory(); PlantFactory orangefactory = new OrangeFactory(); Plant apple = applefactory.makeplant();... 8

Prototype Prototype pattern = kontrolované vytváření kopií objektů. Zavedeme interface Cloneable,ten předepisuje metodu clone(), kterou musí implementovat všechny odvozené třídy. Odvozené třídy v metodě clone vytvoří kopii sebe sama. Shallow copy - clone() vytvoří novou instanci té samé třídy a nastaví všechny atributy na hodnoty atributů z instance na které voláme clone(). Deep copy - clone() provede shallow copy a pak clone() i všech navázaných objektů. Naklonuje celý objektový graf. Hloubka kopie může být různá. Cloneable 9

Prototype public interface Cloneable { Cloneable clone(); public class Address implements Cloneable { private String street; public Address(String street){ this.street = street; @Override public Cloneable clone() { return new Address(this.street); public class Employee implements Cloneable { private String name; private Address address; public Employee(String name, Address address){ this.name = name; this.address = address; @Override public Cloneable clone() { return new Employee(this.name, (Address) address.clone()); Client: Employee employee = new Employee("Karel Novak", new Address("Karlova 12")); Employee employeecopy = (Employee) employee.clone(); 10