Návrhový vzor Factory v JAVA API



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

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

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

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

1. Dědičnost a polymorfismus

Návrhové vzory OMO, LS 2014/2015

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

Vyřešené teoretické otázky do OOP ( )

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

Programátorská příručka

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áˇr Java X J2EE Semináˇr Java X p.1/23

Reranking založený na metadatech

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

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

1. Programování proti rozhraní

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

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

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

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

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

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

Zpracoval:

java remote method invocation Kateřina Fricková, Matouš Jandek

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.

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

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Obsah. Zpracoval:

Tvorba informačních systémů

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Abstract Factory úvod

Základy objektové orientace I. Únor 2010

typová konverze typová inference

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

Unifikovaný modelovací jazyk UML

Úvod do programovacích jazyků (Java)

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

Generické programování

OOT Objektově orientované technologie

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

1 Strukturované programování

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

ADMINISTRACE POČÍTAČOVÝCH SÍTÍ. OPC Server

1. Webové služby. K čemu slouží? 2. RPC Web Service. 3. SOA Web Service. 4. RESTful Web services

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

IS pro podporu BOZP na FIT ČVUT

Analýza a Návrh. Analýza

VÝVOJ INTERNETOVÝCH APLIKACÍ - VIA

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

6 Objektově-orientovaný vývoj programového vybavení

Osnova. GIOP a IIOP IDL IOR POA. IDL Klient Server. 2 Historie. 3 Princip a základní pojmy. 4 Implementace. 5 Aplikace CORBA

Elektronická podpora výuky předmětu Komprese dat

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

INFORMAČNÍ SYSTÉM VIDIUM A VYUŽITÍ MODERNÍCH TECHNOLOGIÍ

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

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím

Objektové programování

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.

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Rozhraní pro práci s XML dokumenty. Roman Malo

Virtuální metody - polymorfizmus

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

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

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

Nové vývojové nástroje i5/os Rational Developer for System i V7.1

Vazba (volná, těsná) - míra znalosti jedné třídy*komponenty o druhé.

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

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

7 Jazyk UML (Unified Modeling Language)

A G O N O T. RNDr. Filip Zavoral, Ph.D. Počet řešitelů: 4 5. Termín dokončení: červen 2013 ORGANIZÁ TOR TU R NA JŮ

Common Object Request Broker Architecture

Funkční objekty v C++.

1/1 ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE PROVOZNĚ EKONOMICKÁ FAKULTA PŘIJÍMACÍ ŘÍZENÍ 2017/2018

Správa verzí souborů na cvičení

Vývoj multiplatformní aplikace v Qt

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

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

Stručný úvod pro programátory. Michal Kuchta

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

Sem vložte zadání Vaší práce.

ANOTACE vytvořených/inovovaných materiálů

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

Softwarové komponenty a Internet

43 HTML šablony. Záložka Šablony v systému

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

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

Chain of responsibility

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

7.5 Diagram tříd pokročilé techniky

1 Webový server, instalace PHP a MySQL 13

CineStar Černý Most Praha

Matematika v programovacích

3 druhy UML diagramů

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

Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

Embedded vývoj v Clutteru a Mx

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

Transkript:

Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB - Technická univerzita Ostrava martin.kot.fei@vsb.cz Abstrakt V třídách API jazyka JAVA je použito mnoho návrhových vzorů. Najdeme zde i tvořící vzory Factory a Factory Method. V tomto textu je uvedeno několik konkrétních případů. Aby o nich čtenář získal lepší představu, je ke každému příkladu vyobrazen diagram tříd a stručný popis vysvětlující, k čemu továrna v dané implementaci slouží. Největší prostor je věnován třídě java.awt.toolkit a objektům, které generuje. 1 Úvod 1.1 Návrhové vzory Objektová orientace se v programování prosazuje již řadu let. Za tu dobu se zjistilo, že se často stejné problémy opakují pouze v malých obměnách. Na řadu z nich se našla vhodná řešení. Tato řešení nazýváme návrhové vzory. Každý návrhový vzor tvoří množina objektů a tříd, které jsou propojeny vazbami. Když se při návrhu konkrétního systému objeví problém, který by mohl nějaký návrhový vzor vyřešit, nahradíme třídy návrhového vzoru třídami z našeho systému. Přitom potřebujeme, aby navzájem zaměněné třídy měly v řešené situaci stejné chování. Protože užitím návrhového vzoru řešíme jen jeden problém, mohou se v těchto třídách vyskytovat i další metody, řešící jiné problémy. Všechny metody vyžadované návrhovým vzorem musí být k dispozici, aby výsledný objektový návrh mohl plnit svou funkci. Obdobně musí zůstat zachovány vazby požadované návrhovým vzorem, ale můžeme přidat další pro jiné potřeby. Návrhové vzory dělíme podle účelu do tří skupin: Tvořící vzory (Creational patterns) - Přenechávají tvorbu některých objektů podtřídám nebo jiným objektů. Příklady jsou (ponechávám užívané anglické názvy, i když se občas objevují pokusy o překlad): - Factory (někdy také Abstract Factory) - Poskytuje rozhraní pro tvoření rodin příbuzných objektů bez specifikace konkrétních tříd. 1

- Factory Method - Definuje rozhraní pro tvorbu objektů, ale nechá podtřídu rozhodnout, kterou třídu konkrétně instanciovat. - Prototype - Specifikuje druhy objektů, které tvoří kopírováním prototypu. Strukturální vzory (Structural patterns) - Popisují obecné struktury objektů a tříd. Příklady jsou: - Composite - Skládá objekty do stromové struktury. Klient může zacházet s jednotlivými prvky stejně jako se složeninou z více prvků. - Adapter - Převádí rozhraní třídy na takové, jaké potřebuje klient. - Decorator - Připojuje k objektu dynamicky další funkčnost. - Proxy - Poskytuje pro nějaký objekt zástupce, který řídí přístup k tomuto objektu. Vzory chování (Behavioral patterns) - Popisují algoritmy nebo spolupráci objektů. Příklady jsou: - Chain of Responsibility - Snaží se zabránit, aby žádost uživatele mohlo zpracovat více objektů. Objekty se zřetězí a zpráva postupně putuje po řetězci, dokud ji některý objekt nezpracuje. - Observer - Definuje závislost n objektů na jednom jiném. Pokud tento jeden objekt změní stav, jsou o změně informovány všechny závislé objekty. - Iterator - Umožňuje sekvenční přístup k prvkům agregovaného objektu, aniž by klient musel znát vnitřní strukturu agregace. - State - Umožňuje objektu měnit chování na základě vnitřního stavu. - Strategy - Umožňuje změnu algoritmu nezávisle na klientovi, který algoritmus užívá. 1.2 API jazyka JAVA Aplikační programátorské rozhraní (API - Application Program Interface) jazyka JAVA je soubor tříd, které jsou k dispozici programátorům v tomto jazyce. V třídách API nalezneme implementaci několika návrhových vzorů. Například grafické uživatelské rozhraní (GUI - Graphic User Interface) umožňuje vnořování komponent do sebe podle návrhového vzoru Composite. V takto vnořených objektech GUI se události zpracovávají podle vzoru Chain of Responsibility. Při implementaci návrhového vzoru Observer stačí sledovaný objekt zdědit z třídy Observer a pozorovatelé musí implementovat rozhraní Observable. Samozřejmě, že použití návrhových vzorů v JAVě není omezeno jen na ty, které jsou již přímo v API. Každý uživatel si může vlastní třídy navrhnout s využitím některého vzoru. Tato práce má ale za cíl zmapovat použití návrhového vzoru Factory v API jazyka JAVA a proto se možnostmi užití návrhových vzorů aplikačními programátory ve vlastních návrzích zabývat nebude. V názvech API tříd se slovo factory vyskytuje poměrně často, ale jde spíše o implementace návrhového vzoru Factory Method. Proto bude sekce textu označená 3 věnována tomuto vzoru. V sekci 2 bude popsán vzor Abstract Factory a jeho dvě implementace v API. 2

2 Abstract Factory 2.1 Abstraktní popis Pro představu, v čem je užití návrhového vzoru vhodné, si představme následující příklad. Mějme aplikaci, která používá komunikaci přes sít. Můžeme mít požadavek na zabezpečenou komunikaci i nezabezpečenou. Aplikace se současně může chovat bud jako klient nebo jako server. Nezabezpečenou komunikaci provádí třídy UnsecureSocket na straně klienta a UnsecureServerSocket na straně serveru. Komunikaci zabezpečenou protokolem SSL obdobně zajišt ují třídy SSLSocket a SSLServerSocket. Pokud bychom aplikaci psali bez použití Factory, museli bychom při přepsání aplikace z nezabezpečené komunikace na zabezpečenou změnit v kódu konstruktory pro tvorbě socketů na jiné třídy. Použitím Abstract Factory si situaci můžeme zjednodušit.sslsocket a UnsecureSocket zdědíme ze společné třídy Socket nebo je necháme implementovat interface Socket, abychom zajistili jejich jednotné rozhraní. Pro SSLServerSocket a UnsecureServerSocket obdobně vytvoříme nadtřídu nebo interface ServerSocket. Přidáme třídu SocketFactory, která bude mít dvě metody: createsocket():socket createserversocket():serversocket Z ní zdědíme třídy SSLSocketFactory tvořící v implementaci obou metod instance tříd pro zabezpečené sockety a UnsecureSocketFactory tvořící instance tříd pro nezabezpečené sockety. Místo přímého volání konstruktorů budeme sockety tvořit prostřednictvím SocketFactory. Převod z nezabezpečené komunikace na zabezpečenou se provede jednoduše v kódu na jednom místě nahrazením konstruktoru třídy UnsecureSocketFactory za SSLSocketFactory. Výhoda se může projevit i v budoucnu. Až se objeví nový protokol pro zabezpečenou komunikaci, vytvoříme se novou podtřídu třídy SocketFactory a dvě třídy implementující sockety zabezpečené novým protokolem zděděné z našich obecných tříd pro sockety. Nebudeme muset procházet celý rozsáhlý kód a měnit staré třídy za nové. Pouze zase v jednom místě nahradíme starou podtřídu SocketFactory za novou. Celá situace je znázorněna na obrázku 1. Podobných situací vhodných pro použití vzoru Abstract Factory je mnoho. Uvidíme je i v API jazyka JAVA. Abstraktní zobrazení návrhového vzoru je na obrázku 2. 2.2 Toolkit Nejdůležitějším použitím návrhového vzoru Factory v JAVě je třída java.awt.toolkit. Programátor s jejím využitím může psát programy vybavené grafickým uživatelským rozhraním (GUI) přenositelné mezi platformami. Na každé platformě potom GUI může mít odlišný vzhled a případně i chování, ale z hlediska spolupráce s dalšími objekty má GUI pořád stejné rozhraní. java.awt.toolkit má celou řadu metod tvořících různé druhy objektů. Na obrázku 3 je zobrazen diagram tříd znázorňující tvorbu dvou produktů - java.awt.peer.buttonpeer 3

Obrázek 1: Diagram tříd motivačního příkladu užití Abstract Factory Obrázek 2: Diagram tříd abstrakce návrhového vzoru Abstract Factory 4

a java.awt.peer.labelpeer. Konkrétní továrna sun.awt.windows.wtoolkit je implementací firmy Sun pro platformu Windows a sun.awt.motif.mtoolkit pro XWindows v unixových systémech. Obrázek 3: Diagram tříd zobrazující propojení Toolkit se dvěma druhy produktů Každou tvořící metodu z java.awt.toolkit používá objekt jiné třídy, protože si tím tvoří vlastní vzhled. Na obrázku 3 je java.awt.peer.buttonpeer vytvořen a užíván objektem třídy java.awt.button a obdobně java.awt.peer.labelpeer objektem třídy java.awt.label. V tabulce 1 je seznam všech tvořících metod třídy java.awt.toolkit a tříd, které využívají volání těchto metod k vytvoření svého vzhledu. V diagramu tříd na obrázku 3 byly jen dva abstraktní produkty a jim příslušné konkrétní produkty. Obrázky 4, 5 a 6 zobrazují celou hierarchii abstraktních produktů a konkrétních produktů pro platformu Windows. Abstraktními produkty zde jsou všechny interface z balíku java.awt.peer, které jsou návratovou hodnotou některé metody v tabulce 1. Konkrétní produkty představují všechny objekty implementující tato rozhraní. Na zmíněných obrázcích to jsou ty, jejichž názvy začínající W a nacházejí se v balíku sun.awt.windows. Právě ony jsou továrnou sun.awt.windows.wtoolkit ve skutečnosti tvořeny. Třídy v balíku sun.awt.motif mají hierarchii téměř stejnou jen s malými odlišnostmi (např. MFileDialogPeer dědí z MDialogPeer). Také ony implementují rozhraní z balíku 5

Metoda createbutton():java.awt.peer.buttonpeer createcanvas():java.awt.peer.canvaspeer createcheckbox():java.awt.peer.checkboxpeer createcheckboxmenuitem(): java.awt.peer.checkboxmenuitempeer createchoice():java.awt.peer.choicepeer createcomponent():java.awt.peer.lightweightpeer createdialog():java.awt.peer.dialogpeer createfiledialog():java.awt.peer.filedialogpeer createframe():java.awt.peer.framepeer createlabel():java.awt.peer.labelpeer createlist():java.awt.peer.listpeer createmenu():java.awt.peer.menupeer createmenubar():java.awt.peer.menubarpeer createpanel():java.awt.peer.panelpeer createpopupmenu():java.awt.peer.popupmenupeer createscrollbar():java.awt.peer.scrollbarpeer createscrollpane():java.awt.peer.scrollpanepeer createtextarea():java.awt.peer.textareapeer createtextfield():java.awt.peer.textfieldpeer createwindow():java.awt.peer.windowpeer Klient java.awt.button java.awt.canvas java.awt.checkbox java.awt.checkboxmenuitem java.awt.choice java.awt.component java.awt.dialog java.awt.filedialog java.awt.frame java.awt.label java.awt.list java.awt.menu java.awt.menubar java.awt.panel java.awt.popupmenu java.awt.scrollbar java.awt.scrollpane java.awt.textarea java.awt.textfield java.awt.window Tabulka 1: Tabulka tvořících metod třídy Toolkit a tříd využívajících tyto metody 6

java.awt.peer a představují konkrétní produkty. Jiné firmy mohou vytvořit další konkrétní továrnu i produkty pro další platformy i alternativní pro stejné platformy. Běžný programátor v jazyce JAVA však tvořící metody třídy Toolkit přímo nikdy volat nebude. Na rozdíl od běžných tříd JAVA API, zdrojové kódy balíku sun.awt.windows nejsou součástí distribuce JDK a tím ani API dokumentace. Jsou v distribuci obsaženy jen jako binární class soubory. Objekty grafického rozhraní, uvedené v tabulce 1 jako klienti, si vytvářejí svůj objekt peer. Tento objekt se stará o vzhled a chování objektu grafického rozhraní po celou dobu jeho životního cyklu. Příkladem situace, kdy se peer objekt vytvoří, je přidání nějaké komponenty (např. tlačítka) do kontejneru (např. okna). Diagram sekvencí zobrazující tuto situaci je na obrázku 7. Je zde zanedbáno rušení objektů, které není pro pochopení funkce továrny podstatné. Nalezení konkrétní podtřídy třídy java.awt.toolkit je zda vykonáno statickou metodou getproperty() třídy java.lang.system. V této třídě jsou systémové vlastnosti nastaveny nativními metodami. Metodě getproperty() se dá jako parametr název vlastnosti ( java.awt.toolkit ) a návratovou hodnotou je řetězec se jménem toolkitu pro aktuální systém, na kterém aplikace běží. Statickou metodou forname() třídy Class, které se jako parametr předá získaný název toolkitu, se vytvoří nový objekt Class a z něj již je možné vytvořit objekt nalezené podtřídy java.awt.toolkit. Na konci sekvence je tak vytvořen systémově závislý peer objekt systémově nezávislými metodami. Prvky rozhraní v tělech svých metod provádějících systémově závislé operace (show() apod.) volají příslušnou metodu svého peer objektu, který akci provede. 2.3 EditorKit Dalším příkladem užití Factory v Javě je javax.swing.text.editorkit. Roli klienta zde hraje javax.swing.jeditorpane. Objekty této třídy si prostřednictvím EditorKit vytvářejí objekty Document a ViewFactory z balíku javax.swing.text. Situace je znázorněna diagramem tříd na obrázku 8. ViewFactory zde i přes své jméno hraje roli produktu. Jméno této třídy souvisí s tím, že jde o implementaci vzoru Factory Method pro tvoření objektů typu javax.swing.text.view pro nějakou komponentu. Pro různé typy dokumentů se vytvoří objekty různých podtříd ViewFactory, aby potom generovaly jen vhodné objekty typu View. Objekty View jsou odpovědné za zobrazení dokumentu. Document slouží jako kontejner na text pro textové prvky rozhraní SWING. Standardně poskytuje např. metody pro vracení celého nebo části textu, nahrazení nebo vymazání části textu atd. Konkrétní implementace mohou přidat prvky, jako například dělení na kapitoly, sekce apod. a další vlastnosti různých formátů dokumentů. Konkrétní produktová třída HTMLFactory je vnitřní třídou HTMLEditorKit, obdobně StyledViewFactory je vnitřní třídou StyledEditorKit a PlainEditorKit je v JEditorPane. PlainEditorKit implementuje rozhraní ViewFactory a dědí z třídy DefaultEditorKit. To mu umožňuje se chovat jako továrna i produkt současně. Pokud je na takový objekt zavolána metoda getviewfactory(), vrací sám sebe. Nevzniká tak ani nová instance. 7

Obrázek 4: Diagram tříd - 1.část hierarchie produktů tvořených továrnou Toolkit 8

Obrázek 5: Diagram tříd - 2.část hierarchie produktů tvořených továrnou Toolkit 9

Obrázek 6: Diagram tříd - 3.část hierarchie produktů tvořených továrnou Toolkit 10

Obrázek 7: Diagram sekvencí pro vložení tlačítka do okna 11

Obrázek 8: Diagram tříd pro EditorKit 12

3 Factory Method 3.1 Abstraktní popis Návrhový vzor Factory Method patří stejně jako Abstract Factory do skupiny tvořících vzorů. Slouží k vytvoření instance jedné z několika možných tříd, často v závislosti na poskytnutých datech. Obvykle všechny třídy, které vrací, mají shodnou nadtřídu a metody, ale každá z nich provádí úkol jiným způsobem a je optimalizována pro jiný typ dat. Rozhodnutí o tom, kterou třídu vrátit nechává tvořící třída na své podtřídě a sama pracuje nezávisle na zvolené produktové třídě. Na obrázku 9 je abstraktní zobrazení tohoto vzoru. Obrázek 9: Diagram tříd - abstrakce vzoru Factory Method Někdy se za použití vzoru Factory Method považuje i situace, kdy o konkrétním produktu nerozhoduje podtřída, ale tvořící metoda tvořící třídy na základě dodaných dat. To je případ několika tříd v JAVA API obsahujících slovo factory. Rovněž v několika případech je v API definováno jen rozhraní tvořícího objektu, ale není k dispozici žádná implementace. 3.2 PopupFactory PopupFactory se nachází v balíku javax.swing a, jak jméno napovídá, je používána k získávání instancí třídy Popup. Ty jsou užívány k zobrazení prvku (instance Component) nad všemi ostatními prvky. Popup getpopup(component owner, Component contents, int x, int y) rozhoduje o konkrétní podtřídě třídy Popup na základě svých parametrů. Všechny podtřídy jsou vnitřními třídami Popup. Situace je zobrazena diagramem tříd na obrázku 10. 3.3 KeyFactory Třída KeyFactory se nachází v balíku java.security. Slouží k převodu specifikací kryptografických klíčů (instance KeySpec) na objekty reprezentující klíče samotné (instance Key) a opačně. Metody 13

Obrázek 10: Diagram tříd - PopupFactory PrivateKey generateprivate(keyspec keyspec) PublicKey generatepublic(keyspec keyspec) tedy rozhodují o konkrétní návratové třídě klíče podle dodané specifikace v argumentu. Diagram tříd zobrazující třídy generované touto továrnou je na obrázku 11. Třída KeyFactory při tvorbě klíčů využívá KeyFactorySpi. Tato třída je abstraktní a ve zdrojových kódech obsažených v distribucí JDK a tím ani v API dokumentaci není žádná její podtřída. Také tam není žádná implementace rozhraní odvozených z PrivateKey a PublicKey. Mezi binárními třídami jsou však v balíku sun.security.provider implementace rozhraní DSAPublicKey a DSAPrivateKey pod stejným jménem. Také tam existuje podtřída KeyFactorySpi se jménem DSAKeyFactory. Pro ostatní protokoly by musely při použití být podobné třídy vytvořeny. 3.4 SocketImplFactory Třída Socket reprezentuje klientský konec sít ového spojení. Skutečnou práci ale provádějí objekty tříd implementujících SocketImpl. Socket si takový objekt vytvoří pomocí metody SocketImpl createsocketimpl() továrny SocketImplFactory. Diagram tříd pro tuto aplikaci Factory Method je na obrázku 12. 3.5 DocumentBuilderFactory Třída DocumentBuilderFactory definuje továrnu, která umožňuje aplikacím získat parser. Ten potom vytváří stromy DOM objektů z XML dokumentů. Jak je vidět na diagramu tříd na obrázku 13, k dispozici je jedna neabstraktní implementace tvořícího objektu i produktu. Obě se nacházejí v balíku org.apache.crimson.jaxp. 14

Obrázek 11: Diagram tříd - KeyFactory Obrázek 12: Diagram tříd - SocketImplFactory 15

Obrázek 13: Diagram tříd - DocumentBuilderFactory 4 Závěr V tomto textu je uvedeno jen několik příkladů použití návrhových vzorů Factory nebo Factory Method v API jazyka JAVA. Ostatní aplikace tohoto vzoru jsou obdobné. Často tovární třídu využívají jiné třídy z API a aplikační programátor tvořící metody přímo neužije. Velký význam má hlavně Toolkit, který také pracuje skrytě před programátory a zajišt uje možnost psát platformově nezávislé aplikace s grafickým uživatelským rozhraním. 16