Vzor Továrna - Factory

Rozměr: px
Začít zobrazení ze stránky:

Download "Vzor Továrna - Factory"

Transkript

1 1 SW_07 Návrhový vzor: Továrna - Factory 1. Jednoduchá továrna - Simple Factory 2. Tovární metoda - Factory Method 3. Abstraktní továrna - Abstract Factory

2 Vzor Továrna - Factory 2 Kontext: při vytváření třídy obyčejně doplníme konstruktory na tvorbu instancí, Problém: někdy klient potřebuje nový objekt, ale neví, od které z několika možných tříd (hierarchie) vytvořit instanci, metoda new není špatná, je ale problémem při změnách rozšiřování funkčnosti (přidávání dalších podtříd).

3 Vzor Továrna - Factory 3 Řešení: vzor Továrna ukládá všechny proměnné aspekty spojené s tvorbou instancí do třídy Továrna nebo jejich podtříd a vytváří tak instance požadovaných tříd. Klient je odcloněn od tvorby konkrétních instancí. Rozlišujeme tři formy vzoru Továrna, a to 1. jednoduchá továrna, 2. tovární metoda, 3. abstraktní továrna.

4 Outline 4 Kachna kachna = new DivokaKachna(); Programování proti rozhraní. Kachna kachna; if(piknik) { kachna = new DivokaKachna(); else if (myslivost) { kachna = new KachniVabnicka(); else if (koupani) { kachna = new GumovaKachna(); Existuje řada různých kachen k různému použití. Podle toho chceme vytvářet instanci dané kachny.

5 Metoda new 5 Metoda new (vytvoření instance) je pevně spojena s konkrétní třídou. Programový návrh by měl být otevřený pro rozšiřování (přidávání dalších tříd), ale také blízký pro modifikaci. Programování proti rozhraní. Způsob řešení: identifikace aspektů, které se mění jejich oddělení od zbytku neměnné aplikace.

6 Outline 6 Pizza orderpizza() { Pizza pizza; Pizza pizza = new Pizza() (); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; Identifikace aspektů, které se mění. Třída Pizza by měla být kvůli flexibilitě rozhraním, nebo abstraktní třídou Nedostatek: potřebujeme více než pouze jeden typ pizzy

7 Outline 7 Pizza orderpizza(string type) { Pizza pizza = null; Možnost změnit typ pizzy if (type.equals("cheese")) { pizza = new CheesePizza(); else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); else if (type.equals("clam")) { pizza = new ClamPizza(); else if (type.equals("veggie")) { pizza = new VeggiePizza(); část, která se mění další typy v závislosti na typu se vytváří konkrétní instance pizzy pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; část, která zůstává stejná

8 Zapouzdření objektu vytváření instancí 8 Vytvoříme novou třídu, do které uložíme původní část kódu z metody orderpizza(). Tuto novou třídu nazveme Factory továrna. Obecně Factories (továrny)se zabývají detaily vytváření objektů. Tím máme SimplePizzaFactory kdykoli chceme další objekt (instanci), požádáme pizza factory o nový objekt.

9 public class SimplePizzaFactory { Outline 9 public Pizza createpizza(string type) { Pizza pizza = null; if (type.equals("cheese")) { pizza = new CheesePizza(); else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); else if (type.equals("clam")) { pizza = new ClamPizza(); else if (type.equals("veggie")) { pizza = new VeggiePizza(); return pizza;

10 PizzaStore obchod s pizzou 10 Obchod s pizzou (PizzaStore) tvoří klientský kód (kód klienta). Factory (továrna) nám vytvoří požadovanou pizzu.

11 1. Simple Factory 11 Simple Factory je spíše idiomem, než návrhovým vzorem.

12 abstract public class Pizza { String name; String dough; String sauce; ArrayList toppings = new ArrayList(); Outline 12 public String getname() { return name; public void prepare() { System.out.println("Preparing " + name); public void bake() { System.out.println("Baking " + name); public void cut() { System.out.println("Cutting " + name); public void box() { System.out.println("Boxing " + name);

13 Outline 13 public class CheesePizza extends Pizza { public CheesePizza() { name = "Cheese Pizza"; dough = "Regular Crust"; sauce = "Marinara Pizza Sauce"; toppings.add("fresh Mozzarella"); toppings.add("parmesan"); Specializovanější třídy třídy Pizza.

14 public class SimplePizzaFactory { Outline 14 public Pizza createpizza(string type) { Pizza pizza = null; if (type.equals("cheese")) { pizza = new CheesePizza(); else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); else if (type.equals("clam")) { pizza = new ClamPizza(); else if (type.equals("veggie")) { pizza = new VeggiePizza(); return pizza; Odkaz na pizzu Programování proti rozhraní.

15 public class PizzaStore { SimplePizzaFactory factory; // konstruktor public PizzaStore(SimplePizzaFactory factory) { this.factory = factory; Klient Outline odkaz na factory 15 public Pizza orderpizza(string type) { Pizza pizza; pizza = factory.createpizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;

16 Outline 16 public class PizzaTestDrive { public static void main(string[] args) { SimplePizzaFactory factory = new SimplePizzaFactory(); PizzaStore store = new PizzaStore(factory); Aplikace Odkaz na factory Pizza pizza = store.orderpizza("cheese"); System.out.println("We ordered a " + pizza.getname() + "\n"); " pizza = store.orderpizza("veggie"); System.out.println("We ordered a " + pizza.getname() + "\n"); "

17 Jednoduchá továrna 17 Existuje jen jeden typ továrny, tedy pouze jedna třída Tovarna. Existuje pouze jeden produkt (pizza), který je dále specifikovaný do různých druhů pizz. Třída PizzaStore představuje klienta.

18 Rozšiřování obchodů s pizzou 2. Factory Method 18 Potřebujeme mít různé typy továren vytvářející jeden produkt dále specializovaný. Chceme rozšířit obchody např. NY, Chicago. Každý regionální obchod může mít odlišnosti v nabídce stylů pizzy (NY, Chicago, California) mají odlišné možnosti. Chceme, aby regionální obchody byly ovlivněny kódem PizzaStore pizzy jsou připravovány stejným způsobem.

19 Možný přístup 19 Vyjdeme z SimplePizzaFactory a vytvoříme tři odlišné factories: NYPizzaFactory, ChicagoPizzaFactory, CalifirniaPizzaFactory.

20 Outline 20 NYPizzaFactory nyfactory = new NYPizzaFactory(); PizzaStore nystore = new PizzaStore(nyFactory nyfactory); nystore.order( Cheese ); ChicagoPizzaFactory chicagofactory = new ChicagoPizzaFactory(); PizzaStore chicagostore = new PizzaStore(chicagoFactory chicagofactory); chicagostore.order( Cheese ); vytvoření factory pro přípravu NY pizza stylu vytvoření PizzaStore a předání odkazu na factory objednání pizzy v NY stylu

21 Zvýšení řízení kvality 21 Myšlenka SimpleFactory je, že koncesní obchody (franchize) využívají factory k výrobě instancí, ale již např. používají jiné krabice box() a zapomínají krájet pizzu cut(). Nutnost vytvoření frameworku, který sváže Nutnost vytvoření frameworku, který sváže pevněji jednotlivé obchody s pizzou, ale stále zachová pružnost (flexibilitu).

22 Framework pro obchody s pizzou 22 Existuje cesta, jak soustředit všechny aktivity vytváření pizzy do třídy PizzaStore a nechat frameworku prostor pro regionální styl prodejen. Postup: createpizza() přijde zpět do třídy PizzaStore, ale jako abstraktní metoda. pro regionální styly se vytvoří podtřídy od třídy PizzaStore.

23 public abstract class PizzaStore { Outline 23 public Pizza orderpizza(string type) { Pizza pizza = createpizza(type); System.out.println("--- Making a " + pizza.getname() + " ---"); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; abstract Pizza createpizza(string item);

24 Podtřídy mohou rozhodovat 24 public Pizza createpizza(string item) { if (item.equals("cheese")) { return new ChicagoStyleCheesePizza(); else if (item.equals("veggie")) { return new ChicagoStyleVeggiePizza(); else if (item.equals("clam")) { return new ChicagoStyleClamPizza(); else if (item.equals("pepperoni")) { return new ChicagoStylePepperoniPizza(); else return null;

25 Metody createpizza() a orderpizza() 25 Metoda orderpizza() je definovaná v abstraktní třídě PizzaStore, ale konkrétně je dotvořena v podtřídách. Metoda orderpizza() volá metodu createpizza(), aby skutečně dostala objekt pizza. Metoda orderpizza() nemůže vytvořit objekt pizza, protože neví jak. Když orderpizza() volá createpizza(), jedna z podtříd PizzaStore to provede.

26 Úprava třídy PizzaStore 26 Všechny podtřídy třídy PizzaStore (regionální obchody) musí doplnit metodu createpizza(), která implementuje jejich (regionální styl) pizzy.

27 Outline 27 public class NYPizzaStore extends PizzaStore { Pizza createpizza(string item) { if (item.equals("cheese")) { return new NYStyleCheesePizza(); else if (item.equals("veggie")) { return new NYStyleVeggiePizza(); else if (item.equals("clam")) { return new NYStyleClamPizza(); else if (item.equals("pepperoni")) { return new NYStylePepperoniPizza(); else return null;

28 Deklarace factory metody (2) 28 public abstract class PizzaStore public Pizza orderpizza(string type) { Pizza pizza; pizza = createpizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; protected abstract Pizza createpizza(string item); // abstraktní metoda abstract Product factorymethod(string type) podtřídy vytváří konkrétní objekt, metoda vrací Produkt, který je využit v nadtřídě, metoda factory izoluje klienta od znalosti, jaký druh konkrétního produktu je vytvářen (instancionován), metoda factory může mít parametry pro specifikaci vytvářeného produktu.

29 PizzaStore nypizzastore = new NYPizzaStore(); nypizzastore.orderpizza( cheese ); Outline Postup při objednávání: 29 Pizza pizza = createpizza( cheese ); orderpizza() volá createpizza() pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box();

30 public abstract class Pizza { String name; String dough; String sauce; ArrayList toppings = new ArrayList(); void prepare() { System.out.println("Preparing " + name); System.out.println("Tossing dough..."); System.out.println("Adding sauce..."); System.out.println("Adding toppings: "); for (int i = 0; i < toppings.size(); i++) { System.out.println(" " + toppings.get(i)); Outline Musíme doplnit třídu Pizza 30 void bake() { System.out.println("Bake for 25 minutes at 350"); void cut() { System.out.println("Cutting the pizza into diagonal slices"); void box() { System.out.println("Place pizza in official PizzaStore box"); public String getname() { return name;

31 public class NYStyleCheesePizza extends Pizza { public NYStyleCheesePizza() { name = "NY Style Sauce and Cheese Pizza"; dough = "Thin Crust Dough"; sauce = "Marinara Sauce"; Outline podtřída třídy Pizza 31 toppings.add("grated Reggiano Cheese");

32 public class PizzaTestDrive { public static void main(string[] args) { PizzaStore nystore = new NYPizzaStore(); PizzaStore chicagostore = new ChicagoPizzaStore(); Pizza pizza = nystore.orderpizza("cheese"); System.out.println("Ethan ordered a " + pizza.getname() + "\n"); " pizza = chicagostore.orderpizza("cheese"); System.out.println("Joel ordered a " + pizza.getname() + "\n"); " Preparing NY Style Sauce and Cheese Pizza Tossing dough... Adding sauce... Adding toppings: Grated Reggiano Cheese Bake for 25 minutes at 350 Cutting the pizza into diagonal slices Place pizza in official PizzaStore box Ethan ordered a NY Style Sauce and Cheese Pizza Outline Klient hlavní program a výpis 32 Preparing Chicago Style Deep Dish Cheese Pizza Tossing dough... Adding sauce... Adding toppings: Shredded Mozzarella Cheese Bake for 25 minutes at 350 Cutting the pizza into square slices Place pizza in official PizzaStore box Joel ordered a Chicago Style Deep Dish Cheese Pizza

33 Vzor Factory (Továrna) 33 Všechny vzory Factory zapouzdřují vytváření objektu. Metoda Factory zapouzdřuje vytváření objektu tím, že nechá na podtřídě, aby rozhodla, který objekt vytvoří. Rozlišujeme třídy pro vytváření Factory a třídy vlastního produktu - Pizza.

34 Třídy vytváření a třídy produktu 34

35 Paralelní hierarchie 35

36 Simple Factory 36 Jednoduchá továrna (Simple Factory) a tovární metoda (Factory Method)

37 public abstract class PizzaStore { Outline 37 abstract Pizza createpizza(string item); public Pizza orderpizza(string type) { Pizza pizza = createpizza(type); System.out.println("--- Making a " + pizza.getname() + " ---"); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; PizzaStore je abstraktní třída s abstraktní metodou createpizza()

38 public class NYPizzaStore extends PizzaStore { Outline 38 Pizza createpizza(string item) { if (item.equals("cheese")) { return new NYStyleCheesePizza(); else if (item.equals("veggie")) { return new NYStyleVeggiePizza(); else if (item.equals("clam")) { return new NYStyleClamPizza(); else if (item.equals("pepperoni")) { return new NYStylePepperoniPizza(); else return null;

39 public class PizzaTestDrive { Outline 39 public static void main(string[] args) { PizzaStore nystore = new NYPizzaStore(); PizzaStore chicagostore = new ChicagoPizzaStore(); Pizza pizza = nystore.orderpizza("cheese"); System.out.println("Ethan ordered a " + pizza.getname() + "\n"); " pizza = chicagostore.orderpizza("cheese"); System.out.println("Joel ordered a " + pizza.getname() + "\n"); " pizza = nystore.orderpizza("clam"); System.out.println("Ethan ordered a " + pizza.getname() + "\n"); " pizza = chicagostore.orderpizza("clam"); System.out.println("Joel ordered a " + pizza.getname() + "\n"); "

40 Definice vzoru tovární metoda Factory method 40 Návrhový vzor tovární metoda (factory method) definuje rozhraní pro vytvoření objektu, ale nechává na podtřídách implementujících toto rozhraní aby rozhodly, která třída vytvoří objekt (instanci). Tovární metoda tedy odkládá proces instanciace na podtřídu.

41 Tovární metoda Factory Method 41 Product = Pizza; ConcreteProduct = NYStyleCheesePizza; Creator = PizzaStore; factorymethod() = createpizza(); ConcreteCreator = NYPizzaStore factorymethod() = createpizza();

42 Factory Method tovární metoda 42 Tovární metoda je výhodná pokud existuje jeden konkrétní tvůrce (kreátor), protože implementace produktu je oddělena od jeho použití. Pokud přidáte další produkty, nebo změníte implementaci produktu, kreátor to neovlivní. Tovární metodu jsme implementovali jako parametrickou (parametr ovlivňuje typ instance). Tovární metoda však může vytvářet pouze jeden typ instance.

43 Tovární metoda 43 K omezení chyb při předávání parametru (projeví se jako run time error) je možné místo typu (String) využívat enum (výčtový typ). Simple factory nemá podtřídy na rozdíl od Simple factory nemá podtřídy na rozdíl od factory method.

44 Tovární metoda 44 Řešení: Tovární metoda umožňuje tvůrci tříd definovat rozhraní pro vytvářený objekt, zatímco si ponechává volbu, ze které třídy instanci vytvoří.

45 Klasický příklad použití: Iterátor 45 Vzor Iterátor poskytuje způsob zpřístupnit sekvenčně prvky kolekce Při vytváření instancí Iterátorů je použita metoda Factory V rozhraní Collection je metoda V rozhraní Collection je metoda iterator(), kterou pak implementují všechny třídy kolekcí. Metoda iterator() izoluje toho, kdo ji volá od povědomí, od které vlastně třídy vytváří instanci.

46 public class ShowIterator { public static void main(string[] args) { List list = Arrays.asList( new String[] { "fountain", "rocket", "sparkler" ); Outline 46 Iterator iter = list.iterator(); while (iter.hasnext()) System.out.println(iter.next()); // Uncomment the next line to see the iterator's actual class: // System.out.println(iter.getClass().getName());

47 Rozpoznání Metody Factory 47 mylná domněnka, že každá metoda která vytváří a vrací objekt je metoda Factory, v OOP je běžné, že metody vrací nový objekt, fakt, že metoda vytváří nový objekt nemusí znamenat, že je příkladem metody Factory, metoda Factory je metoda, která jednak vytváří nový objekt a dále izoluje klienta od povědomí, od které třídy vytváří objekt, při požadavku na objekt, je definitivní třída objektu, který bude vytvořen závislá na chování objektu Factory, který dostal požadavek na vytvoření nového objektu.

48 Problémy návrhu další rozšiřování 48 potřebujeme zavést další třídu CaliforniaStylePizzaStore.

49 Závislosti a inverzní princip závislosti 49 Pro vysvětlení se posuneme zpět; neznáme OO factories a vše řešíme v jednom objektu.

50 public class DependentPizzaStore { Outline 50 public Pizza createpizza(string style, String type) { Pizza pizza = null; if (style.equals("ny")) { if (type.equals("cheese")) { pizza = new NYStyleCheesePizza(); else if (type.equals("veggie")) { pizza = new NYStyleVeggiePizza(); else if (type.equals("clam")) { pizza = new NYStyleClamPizza(); else if (type.equals("pepperoni")) { pizza = new NYStylePepperoniPizza(); else if (style.equals("chicago")) { if (type.equals("cheese")) { pizza = new ChicagoStyleCheesePizza(); else if (type.equals("veggie")) { pizza = new ChicagoStyleVeggiePizza(); else if (type.equals("clam")) { pizza = new ChicagoStyleClamPizza(); else if (type.equals("pepperoni")) { pizza = new ChicagoStylePepperoniPizza();

51 else { System.out.println("Error: invalid type of pizza"); Outline 51 return null; pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;

52 Závislosti objektů 52 Všechny objekty se vytváří v rámci třídy PizzaStore, místo delegování na factory. Každý nový druh pizzy, vytváří další závislost na PizzaStore. Každá změna konkrétní implementace pizzy, ovlivňuje PizzaStore. PizzaStore závisí na implementaci Pizzy.

53 Princip inverzní závislosti (The Dependency Inversion Principle) 53 Obecně snížení závislostí konkrétních tříd v programovém kódu je záslužná věc. Princip návrhu (Design Principle): Buď závislý na abstrakcích. Nebuď závislý na konkrétních třídách. Je to podobné jako: Programování k rozhraní, ne k implementaci.

54 Princip inverzní závislosti (The Dependency Inversion Principle) 54 Princip inverzní závislosti však vytváří silnější tvrzení o abstrakci: Předpokládá, že naše vysoko úrovňové komponenty by neměly být závislé na nízko úrovňových komponentách; obojí by měly spíše záviset na abstrakcích (rozhraní, abstraktní třídy). Vysoko úrovňová komponenta: je třída, s chováním definovaným pomocí nízko úrovňových komponent. Např. PizzaStore vysoko úrovňová komponenta; její chování je definované v pojmech pizza (vytváří všechny druhy pizz)

55 Princip inverzní závislosti (The Dependency Inversion Principle) 55 Třída PizzaStore je závislá na konkrétních třídách pizza (nízko úrovňové komponenty). Princip říká, být závislý na abstrakcích, jak pro vysokoúrovňové, tak nízko úrovňové komponenty (high level components, low level components).

56 Princip inverzní závislosti (The Dependency Inversion Principle) 56 Pizza bude abstraktní třída. PizzaStore ( high level component ) nyní závisí na abstraktní třídě. Konkrétní podtřídy od třídy Pizza ( low level components ) jsou závislé na abstraktní třídě Pizza také. Metoda factory není jedinou technikou, která se řídí inverzním principem závislosti, ale je jedna z výkonných technik.

57 Princip inverzní závislosti (The Dependency Inversion Principle) 57 Inverzní princip je zde proto, protože obracíme typický způsob myšlení o OO návrhu. Nízko-úrovňové komponenty závisí na abstrakci vyšší úrovně. Vysoko-úrovňové komponenty jsou svázány se stejnou abstrakcí. Závislost top-bottom se změnila. Komponenty high-level a low-level jsou závislé na stejné úrovni abstrakce.

58 Jak nezapomenout na princip 58 O tvorbu konkrétních objektů třídy Pizza se bude starat factory. Žádná proměnná by neměla odkazovat na konkrétní třídu. použití new vede k odkazu na konkrétní třídu, je třeba použít factory, Žádná třída by se neměla odvozovat od konkrétní třídy. pokud vytváříte podtřídu, jste závislý na nadtřídě; je lépe vytvářet podtřídu od abstraktní třídy nebo rozhraní.

59 Jak nezapomenout na princip 59 Žádná metoda by neměla předeklarovat (overrride) implementovanou metodu základních tříd. myslí se tím metodu abstraktní třídy (např. Pizza). Je to jen pomůcka, kterou ne vždy můžeme Je to jen pomůcka, kterou ne vždy můžeme dodržet.

60 Rozšiřování návrhu 3. Abstract Factory 60 V původním návrhu třída Pizza obsahovala pouze jeden typ surovin - produktu (těsto, omáčku, sýr ). Tyto základní suroviny se však rozšiřují a specializují. Vzniká rodina ingrediencí. Specializace továren zůstává a přidává se více produktů.

61 public interface PizzaIngredientFactory { Outline 61 public Dough createdough(); public Sauce createsauce(); public Cheese createcheese(); public Veggies[] createveggies(); public Pepperoni createpepperoni(); public Clams createclam(); Vytváření továren pro ingredience Ingredient factories. Pro každou ingredienci vytváříme konkrétní metodu.

62 public class NYPizzaIngredientFactory implements PizzaIngredientFactory { public Dough createdough() { return new ThinCrustDough(); public Sauce createsauce() { return new MarinaraSauce(); Outline Vytvoříme factory (továrnu) pro každý region. 62 public Cheese createcheese() { return new ReggianoCheese(); public Veggies[] createveggies() { Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() ; return veggies; public Pepperoni createpepperoni() { return new SlicedPepperoni(); public Clams createclam() { return new FreshClams();

63 Úpravy třídy Pizza 63 Máme vytvořené factories pro každý region, které dodávají ingredience podle regionu. Nutné úpravy ve třídě Pizza:

64 public abstract class Pizza { String name; Dough dough; Sauce sauce; Veggies veggies[]; Cheese cheese; Pepperoni pepperoni; Clams clam; abstract void prepare(); void bake() { System.out.println("Bake for 25 minutes at 350"); void cut() { System.out.println("Cutting the pizza into diagonal + slices"); void box() { System.out.println("Place pizza in + official PizzaStore box"); void setname(string name) { this.name = name; String getname() { return name; public String tostring() { // kód který tiskne pizzu Outline 64

65 Úprava podtříd třídy Pizza 65 Dopracovat použití regionálních ingrediencí. Podtřídy využívají factory k vytváření ingrediencí. sauce = ingredientfactory.createsauce();

66 public class CheesePizza extends Pizza { PizzaIngredientFactory ingredientfactory; // konktruktor doplňuje odkaz na ingredientfactory public CheesePizza(PizzaIngredientFactory ingredientfactory) { this.ingredientfactory = ingredientfactory; Outline Podobné je to i u dalších tříd. 66 void prepare() { System.out.println("Preparing " + name); dough = ingredientfactory.createdough(); sauce = ingredientfactory.createsauce(); cheese = ingredientfactory.createcheese();

67 Úprava třídy PizzaStore 67 Potřebujeme přidat reference na jejich lokální továrny ingrediencí.

68 public class NYPizzaStore extends PizzaStore { Outline 68 protected Pizza createpizza(string item) { Pizza pizza = null; PizzaIngredientFactory ingredientfactory = new NYPizzaIngredientFactory(); if (item.equals("cheese")) { pizza = new CheesePizza(ingredientFactory ingredientfactory); pizza.setname("new York Style Cheese Pizza"); else if (item.equals("veggie")) { pizza = new VeggiePizza(ingredientFactory ingredientfactory); pizza.setname("new York Style Veggie Pizza"); else if (item.equals("clam")) { pizza = new ClamPizza(ingredientFactory ingredientfactory); pizza.setname("new York Style Clam Pizza"); Metoda createpizza() má nastavenou lokální proměnnou ingredientfactory na svoji regionální ingredient factory. Tato proměnná se předává každé pizze aby si mohla vytvořit ingredience. else if (item.equals("pepperoni")) { pizza = new PepperoniPizza(ingredientFactory ingredientfactory); pizza.setname("new York Style Pepperoni Pizza"); return pizza;

69 Továrny - Factories 69 Abstraktní továrna poskytuje rozhraní pro skupinu (rodinu) různých produktů. Od abstraktní továrny jsou odvozeny konkrétní továrny, které produkují stejné produkty s jinou implementací.

70 1. Potřebujeme PizzaStore např. NY PizzaStore, PizzaStore nypizzastore = new PizzaStore(); 2. uděláme objednávku, nypizzastore.orderpizza( cheese ); Outline Postup objednání a přípravy pizzy metoda orderpizza() nejdříve volá metodu createpizza(), Pizza pizza = createpizza( cheese ); 4. když je vyvolaná metoda createpizza() tehdy je začleněna ingredient factory, Pizza = pizza new CheesePizza(nyIngredientFactory); 5. potřebujeme připravit pizzu; v okamžiku kdy je zavolána metoda prepare(), je požádána factory k přípravě ingrediencí, void prepare() { dough = factory.createdough(); sauce = factory.createsauce(); cheese = factory.createcheese(); 6. konečně je pizza připravena a metoda orderpizza() volá další metody bake(), cut(), boxes().

71 Vzor 3. Abstract Factory Abstraktní továrna 71 Vzor abstraktní továrna poskytuje rozhraní pro vytváření řady příbuzných nebo závislých objektů bez specifikace jejich konkrétní třídy. Abstraktní továrna dovoluje klientovi používat abstraktní rozhraní k vytváření množiny příbuzných produktů bez znalosti konkrétních produktů, které jsou vytvářeny. Tímto způsobem je klient oddělen od specifikací konkrétních produktů.

72 Abstraktní továrna 72 Client «interface» AbstractProductA «interface» AbstractFactory createproducta() createproductb() ProductA2 ProductA1 ConcreteFactory1 createproducta() createproductb() ConcreteFactory2 createproducta() createproductb() «interface» AbstractProductB ProductB2 ProductB1

73 Abstraktní továrna 73 Klient je napsán oproti abstraktní továrně, ale za běhu programu je to doplněno na konkrétní továrnu. Konkrétní továrny implementují různé rodiny produktů. Klient využívá pouze jednu konkrétní továrnu v daném čase. Každá konkrétní továrna může produkovat celou množinu příbuzných produktů.

74 Abstraktní továrna 74 Pizza prepare() // other methods «interface» Dough «interface» PizzaIngredientFactory createdough() createsauce() createcheese() CreateClams() ThickCrustDough «interface» Sauce ThinCrustDough NYPizzaIngredientFactory ChicagoPizzaIngredientFactory PlumTomatoSauce MarinaraSauce createdough() createsauce() createcheese() CreateClams() createdough() createsauce() createcheese() CreateClams() «interface» Cheese MozzarellaCheese RegglanoCheese «interface» Clams FrozenClams FreshClams

75 public class PizzaTestDrive { Outline 75 public static void main(string[] args) { PizzaStore nystore = new NYPizzaStore(); PizzaStore chicagostore = new ChicagoPizzaStore(); Pizza pizza = nystore.orderpizza("cheese"); System.out.println("Ethan ordered a " + pizza + "\n"); " pizza = chicagostore.orderpizza("cheese"); System.out.println("Joel ordered a " + pizza + "\n"); " pizza = nystore.orderpizza("clam"); System.out.println("Ethan ordered a " + pizza + "\n"); " pizza = chicagostore.orderpizza("clam"); System.out.println("Joel ordered a " + pizza + "\n"); "

76 public abstract class PizzaStore { Outline 76 protected abstract Pizza createpizza(string item); public Pizza orderpizza(string type) { Pizza pizza = createpizza(type); System.out.println("--- Making a " + pizza.getname() + " ---"); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;

77 public class NYPizzaStore extends PizzaStore { Outline 77 protected Pizza createpizza(string item) { Pizza pizza = null; PizzaIngredientFactory ingredientfactory = new NYPizzaIngredientFactory(); if (item.equals("cheese")) { pizza = new CheesePizza(ingredientFactory ingredientfactory); pizza.setname("new York Style Cheese Pizza"); else if (item.equals("veggie")) { pizza = new VeggiePizza(ingredientFactory ingredientfactory); pizza.setname("new York Style Veggie Pizza"); return pizza;

78 public interface PizzaIngredientFactory { Outline 78 public Dough createdough(); public Sauce createsauce(); public Cheese createcheese(); public Veggies[] createveggies(); public Pepperoni createpepperoni(); public Clams createclam();

79 public class NYPizzaIngredientFactory implements PizzaIngredientFactory { Outline 79 public Dough createdough() { return new ThinCrustDough(); public Sauce createsauce() { return new MarinaraSauce(); public Cheese createcheese() { return new ReggianoCheese(); public Veggies[] createveggies() { Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() ; return veggies; public Pepperoni createpepperoni() { return new SlicedPepperoni(); public Clams createclam() { return new FreshClams();

80 public abstract class Pizza { String name; Outline 80 Dough dough; Sauce sauce; Veggies veggies[]; Cheese cheese; Pepperoni pepperoni; Clams clam; abstract void prepare(); void bake() { System.out.println("Bake for 25 minutes at 350"); void cut() { System.out.println("Cutting the pizza into diagonal slices");...

81 public class PepperoniPizza extends Pizza { PizzaIngredientFactory ingredientfactory; Outline 81 public PepperoniPizza(PizzaIngredientFactory ingredientfactory) { this.ingredientfactory = ingredientfactory; void prepare() { System.out.println("Preparing " + name); dough = ingredientfactory.createdough(); sauce = ingredientfactory.createsauce(); cheese = ingredientfactory.createcheese(); veggies = ingredientfactory.createveggies(); pepperoni = ingredientfactory.createpepperoni();

82 public interface Dough { public String tostring(); Outline 82 public class ThickCrustDough implements Dough { public String tostring() { return "ThickCrust style extra thick crust dough";

83 Jiný příklad Abstraktní továrny 83 GameEnvironment -gameelementfactory -player -obstacle +play() «rozhraní» GameElementFactory +makeplayer() +makeobstacle() «rozhraní» Obstacle +action() Puzzle NastyWeapons KillAndDismember KittiesAndPuzzles +action() +action() +makeplayer() +makeobstacle() +makeplayer() +makeobstacle() «rozhraní» Player +interactwith() Kitty KungFuGuy +interactwith() +interactwith()

84 Jiný příklad Abstraktní továrny 84 Produkty, které se vytváří: Obstacle, Player. Továrny: KillAndDismember, KitiesAndPuzzles. Klient - GameEnvironment

85 public interface Obstacle { void action(); Outline 85 public class Puzzle implements Obstacle public void action() { System.out.println("Puzzle"); public class NastyWeapon implements Obstacle public void action() { System.out.println("NastyWeapon");

86 public interface Player { void interactwith(obstacle o); Outline 86 public class KungFuGuy implements Player public void interactwith(obstacle obstacle) { System.out.print("KungFuGuy now battles a "); obstacle.action(); public class Kitty implements Player public void interactwith(obstacle obstacle) { System.out.print("Kitty has encountered a "); obstacle.action();

87 public interface GameElementFactory { Player makeplayer(); Obstacle makeobstacle(); Outline 87

88 public class KittiesAndPuzzles implements GameElementFactory public Player makeplayer() { return new Kitty(); Outline public Obstacle makeobstacle() { return new Puzzle();

89 public class KillAndDismember implements GameElementFactory { Outline public Player makeplayer() { return new public Obstacle makeobstacle() { return new NastyWeapon();

90 public class GameEnvironment { Outline 90 // tovarna private GameElementFactory factory; // produkty private Player player; private Obstacle obstacle; // konstruktor public GameEnvironment( GameElementFactory factory) { this.factory = factory; player = factory.makeplayer(); obstacle = factory.makeobstacle(); public void play() { player.interactwith(obstacle);

91 public class Games { public static void main(string[] args) { Outline 91 // ruzne tovarny GameElementFactory kp = new KittiesAndPuzzles(), kd = new KillAndDismember(); // ruzne prostredi GameEnvironment g1 = new GameEnvironment(kp), g2 = new GameEnvironment(kd); g1.play(); g2.play();

92 Abstraktní továrna 92 Simple factory Factory method Abstract factory. Metody Abstract Factory jsou implementovány jako factory metody. Vzor abstract factory vytváří rodinu příbuzných produktů.

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

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

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

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC 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

Více

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 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25 Seminář Java Návrhové vzory Radek Kočí Fakulta informačních technologií VUT Duben 2009 Radek Kočí Seminář Java Návrhové vzory 1/ 25 Znovupoužitelnost Dědičnost implementace třídy pomocí jiné (již existující)

Více

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

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 Seminář Java Návrhové vzory Radek Kočí Fakulta informačních technologií VUT Duben 2008 Radek Kočí Seminář Java Návrhové vzory 1/ 24 Znovupoužitelnost Dědičnost implementace třídy pomocí jiné (již existující)

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

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

Kód, který se nebude často měnit 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

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

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

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... Seminář Java X Radek Kočí Fakulta informačních technologií VUT Duben 2011 Radek Kočí Seminář Java Návrhové vzory, Zásady... 1/ 37 Obsah Znovupoužitelnost Návrhové vzory Zásady programování Radek Kočí Seminář

Více

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

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí Kolekce obecně Seznamy a iterátory doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Kolekce ::= homogenní sada prvků

Více

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

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování. Jakub Klemsa Jan Legerský Objektově orientované programování klemsjak@fjfi.cvut.cz jan.legersky@gmail.com 30. října 2012 návrhový vzor (design pattern) obecné řešení problému, které se využívá při návrhu

Více

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

IRAE 07/08 Přednáška č. 1 Úvod do předmětu OOP Objekt Proč OOP? Literatura, osnova předmětu viz. cvičení Základní prvek OOP sw inženýrství = model reálných objektů (věcí) člověk, auto, okno (ve windows), slovník, = model abstraktní

Více

RMI Remote Method Invocation

RMI Remote Method Invocation 2. cvičení RMI Remote Method Invocation 2007/09 ver.2.0 1 RMI co to je? vyvolání metody z jiné JVM lokalizace vzdáleného objektu komunikace se vzdálenými objekty přenos objektu v bytecode typicky klient

Více

Základy objektové orientace I. Únor 2010

Základy objektové orientace I. Únor 2010 Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných

Více

Abstraktní třída a rozhraní

Abstraktní třída a rozhraní Abstraktní třída a rozhraní Někdy se může stát, zejména při psaní v hierarchické struktuře hodně nadřazených tříd, že tušíme, že bude ve zděděných třídách vhodné použít nějakou metodu. Tuto metodu ještě

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Úvod do programování - Java. Cvičení č.4

Úvod do programování - Java. Cvičení č.4 Úvod do programování - Java Cvičení č.4 1 Sekvence (posloupnost) Sekvence je tvořena posloupností jednoho nebo více příkazů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení

Více

Návrhové vzory OMO, LS 2014/2015

Návrhové vzory OMO, LS 2014/2015 Návrhové vzory OMO, LS 2014/2015 Motivace Cílem objektového návrhu je strukturu aplikace navrhnout tak, aby splňovala následující kritéria: snadná rozšiřitelnost účelnost testovatelnost dokumentovatelnost

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

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

11.5.2012. 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 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

Abstract Factory úvod

Abstract Factory úvod 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

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

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

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo Statické proměnné a metody Tomáš Pitner, upravil Marek Šabo Úvod Se statickou metodou jsme se setkali už u úplně prvního programu - Hello, world! public class Demo { public static void main(string[] args)

Více

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

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

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

Ú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: Factory Method Úvod - problém n 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 =

Více

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics 1 Parametrizované třídy Generics generické třídy JDK zavádí mimo jiné tzv. parametrizované třídy - generics Úvod 2 podobnost se šablonami (templates) z C++ nejčastěji použité v oblasti knihoven kontejnerového

Více

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance

Více

Seminář Java IV p.1/38

Seminář Java IV p.1/38 Seminář Java IV Seminář Java IV p.1/38 Rekapitulace Deklarace tříd Proměnné, metody, konstruktory, modifikátory přístupu Datové typy primitivní, objektové, pole Dědičnost Řídící konstrukce Podmínky, cykly

Více

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

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 State State Známý jako Stav, Object for States Účel umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu Použitelnost chování objektu závisí na jeho stavu, který se mění za

Více

Návrhové vzory Design Patterns

Návrhové vzory Design Patterns Návrhové vzory Design Patterns doc. Ing. František Huňka, CSc. Ostravská univerzita PřF 1 Definice vzoru Každý vzor popisuje problém, který nastává opakovaně v našem prostředí, a potom popisuje podstatu

Více

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

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické Třídy, polymorfismus A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické Polymorfizmus ~ vícetvarost Polymorfizmus základní vlastnost objektového přístupu základní princip polymorfismu:

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

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

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

KTE / ZPE Informační technologie

KTE / ZPE Informační technologie 4 KTE / ZPE Informační technologie Ing. Petr Kropík, Ph.D. email: pkropik@kte.zcu.cz tel.: +420 377 63 4639, +420 377 63 4606 (odd. informatiky) Katedra teoretické elektrotechniky FEL ZČU Plzeň Největší

Více

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

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 Seminář Java Návrhové vzory, Zásady programování Radek Kočí Fakulta informačních technologií VUT Duben 2010 Radek Kočí Seminář Java Návrhové vzory, Zásady... 1/ 46 Obsah Znovupoužitelnost Návrhové vzory

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

20. Projekt Domácí mediotéka

20. Projekt Domácí mediotéka Projekt Domácí mediotéka strana 211 20. Projekt Domácí mediotéka 20.1. Základní popis, zadání úkolu V projektu Domácí mediotéka (Dome) se jednoduchým způsobem evidují CD a videa. Projekt je velmi jednoduchý

Více

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

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

1. Téma 12 - Textové soubory a výjimky 1. Téma 12 - Textové soubory a výjimky Cíl látky Procvičit práci se soubory s využitím výjimek. 1.1. Úvod Program, aby byl programem, my mít nějaké výstupy a vstupy. Velmi častým případem je to, že se

Více

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

Zapouzdření. Tomáš Pitner, upravil Marek Šabo Zapouzdření Tomáš Pitner, upravil Marek Šabo Co je zapouzdření Naprosto zásadní vlastnost objektového přístupu, možná nejzásadnější Jde o spojení dat a práce s nimi do jednoho celku - objektu Data jsou

Více

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

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu Prototyp Prototyp Účel ( creational kategorie: vytvářecí pro objekty (class specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu Příklad obecný systém pro

Více

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

, Brno Připravil: David Procházka Návrhové vzory 7. 10. 2010, Brno Připravil: David Procházka Návrhové vzory Základy objektově orientovaného návrhu Design Patterns NV (Design patterns) můžeme s nadsázkou označit za ntu, jak řešit určitý problém nejen

Více

SW_12. Vzor Příkaz - Command Vzor Návštěvník - Visitor

SW_12. Vzor Příkaz - Command Vzor Návštěvník - Visitor SW_12 Vzor Příkaz - Command Vzor Návštěvník - Visitor 1 Problém: Vzor Příkaz - Command Standardní cesta pro vykonání metody je její vyvolání. V některých situacích nejsme schopni řídit načasování (timing)

Více

Principy objektově orientovaného programování

Principy objektově orientovaného programování Principy objektově orientovaného programování Třídy a objekty doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz C E T

Více

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz IoC/DI Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz SOLID 5 pravidel pro testovatelný kód Na netestovatelném kódu se IoC/DI používá špatně SOLID Single Responsibility Principle Každá třída

Více

PREPROCESOR POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,

Více

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.

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. 23. Třídy, generické třídy, instance, skládání, statické metody a proměnné. Zapouzdření, konstruktory, konzistence objektu, zpřístupnění vnitřní implementace, modifikátory public a private. Polymorfismus,

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

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

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo Výchozí a statické metody rozhraní Tomáš Pitner, upravil Marek Šabo Výchozí a statické metody rozhraní Java 8 přidává ohledně metod v rozhraní nové možnosti. Neuvidíme je tedy ve starém kódu a mnozí vývojáři

Více

Abstraktní datové typy: zásobník

Abstraktní datové typy: zásobník Abstraktní datové typy: zásobník doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Abstraktní datové typy omezené rozhraní

Více

Jazyk C# (seminář 6)

Jazyk C# (seminář 6) Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí

Více

Dědičnost (inheritance)

Dědičnost (inheritance) Dědičnost (inheritance) Úvod Umožňuje objektům převzít (zdědit) členy jiných objektů a pouze je rozšířit o Auto: lze odvodit Vztah je osobní auto, cisterna jsou auta Základní pojmy Bázová třída (rodič)

Více

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

Objektově orientované programování v PHP 5. Martin Klíma Objektově orientované programování v PHP 5 Martin Klíma OOP & PHP 5 V PHP 5 konečně značné rozšíření OOP Blíží se to moderním programovacím jazykům jako Java nebo C# Výhody OOP Zapouzdření (nové modifikátory

Více

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

Více

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy Základní pojmy Stromy doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Graf uzly hrany orientované / neorientované Souvislý

Více

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy 11 Diagram tříd, asociace, dědičnost, abstraktní třídy Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost diagramům tříd, asociaci,

Více

Programovací jazyk Java

Programovací jazyk Java 1 z 8 Programovací jazyk Java Enumerace (výčty) Složitější definice výčtového typu Konstanty anonymních typů Výčtový typ a datové struktury Java packaging JAR archivy CLASSPATH Apache Ant 10. přednáška

Více

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

3. Třídy. Základní pojmy objektového programování. Třídy 3. Třídy Základní pojmy objektového programování Jak už víme, je Java objektovým programovacím jazykem. V úvodu této kapitoly si objasníme základní pojmy objektové teorie. Objekt představuje souhrn dat

Více

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat. Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat. 1. Odkrokujte následující program a s použitím notace z přednášky popište stav paměti

Více

Návrh softwarových systém. Návrh softwarových systémů

Návrh softwarových systém. Návrh softwarových systémů Návrh softwarových systém ů - Java 8 Jiří Šebek Návrh softwarových systémů (B6B36NSS) Co je nového? Default interface methods Lambda expressions Method references and repeatable annotations Streams Functional

Více

UJO Framework. revoluční architektura beans. verze 0.80 http://ujoframework.org/

UJO Framework. revoluční architektura beans. verze 0.80 http://ujoframework.org/ UJO Framework revoluční architektura beans verze 0.80 http://ujoframework.org/ Pavel Pone(c), září 2008 Historie rok 2004 upravené objekty z frameworku Cayenne nevýhodou byla špatná typová kontrola rok

Více

Java - řazení objektů

Java - řazení objektů Java - řazení objektů Kapitola seznamuje se základními principy řazení objektů Klíčové pojmy: Přirozené řazení, absolutní řazení, ideální porovnávatelná třída ŘAZENÍ OBJEKTŮ U objektů není příliš jasné,

Více

7. Dynamické datové struktury

7. Dynamické datové struktury 7. Dynamické datové struktury Java poskytuje několik možností pro uložení většího množství dat (tj. objektů či primitivních datových typů) v paměti. S nejjednodušší z nich, s polem, jsme se již seznámili.

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

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

public class Karel { private int position; public boolean issmiling; public int getposition() { return position; Objekty, třídy a hierarchie tříd Interface a abstraktní třídy Dědičnost Message passing Class diagramy a příklady systémů modelovaných pomocí OOP Volba správného přístupu Rozdíl mezi asociací, agregací

Více

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd 7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená

Více

9. přednáška - třídy, objekty

9. přednáška - třídy, objekty třída String a její použití kolekce, typované kolekce 9. přednáška - třídy, objekty Algoritmizace (Y36ALG), Šumperk - 9. přednáška 1 Třída String Objekty knihovní třídy String jsou řetězy znaků Od ostatních

Více

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18 Generické typy jsou třídy či interfejsy deklarující tzv. typové parametry jimiž: - systematizují typovou kontrolu kompilátorem, - vyjadřují jasněji smysl, zlepšují čitelnost a robustnost programu, - ulehčují

Více

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

OOPR_05. Případové studie

OOPR_05. Případové studie OOPR_05 Případové studie 1 Přehled probírané látky příklad skládání objektů - čára příklad skládání objektů kompozice a agregace přetížené konstruktory pole jako datový atribut 2 Grafický objekt - čára

Více

Programování II. Návrh programu II

Programování II. Návrh programu II Programování II Návrh programu II Osnova přednášky Dědičnost shrnutí. Návrh programu s využitím dědičnosti Dědičnost shrnutí Klíčové otázky CO je dědičnost? PROČ použít dědičnost? KDY použít dědičnost?

Více

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33 Objekt jako proměnná Objekty a metody Objekt = proměnná referenčního typu vznik pomocí new, chování viz pole jako referenční proměnná minulý semestr Stack Heap objekt ref this 10 20 atr1 atr2 jinyobjekt

Více

Jazyk C# (seminář 3)

Jazyk C# (seminář 3) Jazyk C# (seminář 3) Pavel Procházka KMI October 8, 2014 Motivace Největší využití v programování okenních aplikací a GUI knihoven. Data reprezentujeme pomocí objektů (tříd), máme tedy ucelený pohled na

Více

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

Java - výjimky. private void vstup() throws IOException {... } Java - výjimky Tato kapitola ukazuje na několika příkladech práci s výjimkami v Javě. Klíčové pojmy: Výjimka, hierarchie výjimek, zachytávání výjimek, blok try-catch, tvorba vlastních výjimek, propagace

Více

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu Procesy, vlákna Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu Implementace vláken one-to-one o implementace na úrovni jádra o každé vlákno je pro

Více

Chain of responsibility

Chain of responsibility Chain of responsibility Chain of responsibility n Známý jako n Účel q český překlad řetěz(ec) odpovědnosti q umožnit zasílání požadavků (zpráv) neznámým příjemcům q příjemci tvoří frontu è předávají si

Více

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

Chování konstruktorů a destruktorů při dědění Dědičnost V objektově orientovaném programování je dědičnost způsob, jak vytvořit novou třídu použitím již existujících definic jiných tříd. Takto vytvořené třídy přebírají vlastnosti a metody svého předka

Více

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd. 1. Zapouzdření Cíl látky Tento blok nejdříve přiblíží zásadu zapouzdření a odpoutání kódu a po té na relacích, jako jsou asociace, agregace a kompozice, vysvětlí jak lze objektový zdrojový kód zapouzdřovat

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Struktura programu Vytvoření nové aplikace Struktura programu Základní syntaktické elementy První aplikace Verze pro akademický rok 2012/2013 1 Nová aplikace NetBeans Ve vývojovém

Více

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

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

Více

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

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ Vstupy a výstupy pokračování Kódování textů Texty (řetězce nebo znaky) v jazyce C# jsou v paměti uloženy v kódování označovaném běžně Unicode (kódová stránka 1200).

Více

boolean hasnext() Object next() void remove() Kolekce

boolean hasnext() Object next() void remove() Kolekce 11. Kontejnery Kontejnery Kontejnery jako základní dynamické struktury v Javě Kolekce, iterátory (Collection, Iterator) Seznamy (rozhraní List, třídy ArrayList, LinkedList) Množiny (rozhraní Set, třída

Více

Programování II. Polymorfismus

Programování II. Polymorfismus Programování II Polymorfismus Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad. Přetížení, překrytí, protected Přetížení x překrytí Přetížením řešíme doplnění

Více

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat. Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat. 1. Odkrokujte následující program a s použitím notace z přednášky sledujte stav paměti

Více

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

Motivační příklad reálný svět. výroba (assembly line) Template method Motivační příklad reálný svět n Pásová výroba (assembly line) Motivační příklad SW inženýrství n Otevírání souborů n Třídy Application a Document (+potomci) Motivační příklad SW inženýrství

Více

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

NPRG031 Programování II 1 / :25:46 NPRG031 Programování II 1 / 26 28. 2. 2018 11:25:46 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat jiné objekty

Více

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

NMIN201 Objektově orientované programování 1 / :36:09 NMIN201 Objektově orientované programování 1 / 26 8.10.2013 15:36:09 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat

Více

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/04.0006

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/04.0006 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/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

Více

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce Vektor a Matice Základní pojmy Matice(řádky, sloupce) Matice(4,6) sloupce řádky (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (4,1) (4,2) (4,3)

Více

14.4.1. Typický prvek kolekce pro české řazení

14.4.1. Typický prvek kolekce pro české řazení 14.4. Co všechno by měl mít typický prvek kolekce 177 Poznámka: Třídy BigInteger, BigDecimal a Date budou vysvětleny v částech [15./183, [16./185 a [18.1./204. 14.4.1. Typický prvek kolekce pro české řazení

Více

10 Generické implementace

10 Generické implementace 10 Generické implementace Main Entry: 1 ge ner ic Pronunciation: j&-'ner-ik Function: adjective Etymology: French générique, from Latin gener-, genus birth, kind, class 1 a : relating to or characteristic

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

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

11. Dědičnost. Dědičnost strana 103 Dědičnost strana 103 11. Dědičnost V této kapitole si vysvětlíme jeden ze základních pojmů objektově orientovaného programování dědičnost (inheritance). S ní souvisejí i následující témata: předek a potomek

Více

Abstraktní třídy, polymorfní struktury

Abstraktní třídy, polymorfní struktury Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní třídy, polymorfní struktury BI-PA2, 2011, Přednáška 9 1/32 Abstraktní třídy, polymorfní struktury Ing. Josef Vogel, CSc Katedra softwarového inženýrství

Více

návrhový vzor Singleton.

návrhový vzor Singleton. KAPITOLA 2 Návrhový vzor Singleton Jazyk PHP 5 vám pomocí klíčových slov public, protected a private umožňuje kontrolovat, kdo získá přístup k určitým atributům a metodám třídy. Dále vám jazyk PHP 5 umožňuje

Více

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Quo vadis programování? Automatizace vyhodnocování studentských úloh Vaše jistota na trhu IT Quo vadis programování? Automatizace vyhodnocování studentských úloh Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Vladimír Oraný vladimir.orany@gmail.com Vaše jistota na trhu IT Obsah

Více

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní Základy jazyka C# doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Architektura.NET Historie Vlastnosti

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více