Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
Obsah Úvod Abstract Factory Toolkit EditorKit Factory Method PopupFactory KeyFactory SocketImplFactory DocumentBuilderFactory
Návrhové vzory Obecné řešení často se objevujících problémů Množina objektů a tříd, které jsou propojeny vazbami Dělí se podle funkce na: Tvořící vzory Strukturální vzory Vzory chování
API jazyka JAVA Aplikační programátorské rozhraní (Application Program Interface) Soubor tříd, které jsou k dispozici programátorům Obsahuje implementace různých návrhových vzorů
Abstract Factory Patří mezi tvořící návrhové vzory Další názvy: Factory, Toolkit, Kit Poskytuje rozhraní pro tvoření rodin příbuzných objektů bez specifikace konkrétních tříd Nahrazuje přímé volání konstruktoru voláním tvořící metody továrního objektu
Diagram tříd – abstrakce vzoru Factory
Toolkit java.awt.Toolkit Nejdůležitější užití Factory v JAVA API Umožňuje platformově nezávislé aplikace s grafickým uživatelským rozhraním (GUI) Objekty GUI z balíku java.awt (ve vzoru Factory klienti) si tvoří automaticky „peer“ objekty (ve Factory produkty) s využitím továrny Toolkit Rozhraní pro „peer“ objekty jsou v balíku java.awt.peer Implementace „peer“ objektů jsou např. v balících sun.awt.windows a sun.awt.motif
Diagram tříd – propojení Toolkit se dvěma produkty
Příklady tvořících metod třídy Toolkit MetodaKlient createButton():ButtonPeerButton createCanvas():CanvasPeerCanvas createCheckbox():CheckboxPeerCheckbox createChoice():ChoicePeerChoice createComponent():LightweightPeerComponent createDialog():DialogPeerDialog createFileDialog():FileDialogPeerFileDialog createFrame():FramePeerFrame createLabel():LabelPeerLabel createList():ListPeerList
Diagram tříd – část hierarchie produktů
Jak to funguje? Systémově nezávislé objekty GUI přenechávají systémově závislé akce svým „peer“ objektům „Peer“ objekt je prostřednictvím továrny vytvořen, když je zavolána na objekt GUI první systémová akce a existuje po celou dobu existence objektu GUI Konkrétní podtřídu třídy Toolkit získá objekt GUI voláním statické metody getProperty() třídy System K vytvoření instance továrního objektu se využije třída Class
EditorKit javax.swing.text.EditorKit Klientem je JEditorPane Produkty jsou Document a ViewFactory ViewFactory je továrna pro tvoření objektů View odpovědných za zobrazení dokumentů Document slouží jako kontejnér na text pro textové prvky rozhraní SWING Konkrétní produktová třída HTMLFactory je vnitřní třídou HTMLEditorKit, StyledViewFactory je vnitřní StyledEditorKit a PlainEditorKit je v JEditorPane
Diagram tříd – EditorKit
Factory Method Patří mezi tvořící návrhové vzory Slouží k vytvoření jedné z několika možných tříd Třídy, které vrací, mívají stejné rozhraní a nadtřídu, ale každá úkoly provádí jiným způsobem Rozhodnutí o tom, kterou třídu vrátit, nechává tvořící třída na podtřídě, nebo o konkrétním produktu rozhoduje tvořící metoda na základě poskytnutých dat
Diagram tříd – abstrakce vzoru Factory Method
PopupFactory javax.swing.PopupFactory Slouží k získání instancí třídy Popup Objekty Popup slouží k zobrazení prvku GUI (instance Component ) nad všemi ostatními prvky Metoda getPopup() rozhoduje o konkrétní podtřídě třídy Popup na základě svých parametrů Všechny podtřídy Popup jsou vnitřními třídami Popup
Diagram tříd – PopupFactory
KeyFactory java.security.KeyFactory Slouží k převodu specifikací kryptografických klíčů (instance KeySpec) na objekty reprezentující klíče samotné (instance Key) a opačně Tvořící metody rozhodují o konkrétní třídě vraceného objektu na základě parametrů V distribuci JDK jsou jen implementace DSAPrivateKey a DSAPublicKey v balíku sun.security.provider
Diagram tříd – KeyFactory 1.část
Diagram tříd – KeyFactory 2.část
SocketImplFactory java.net.SocketImplFactory Třída Socket reprezentuje klientský konec síťového spojení. Skutečnou práci provádějí objekty tříd implementujících SocketImpl Socket si vytvoří svůj konkrétní SocketImpl pomocí továrny SocketImplFactory
Diagram tříd – SocketImplFactory
DocumentBuilderFactory Nachází se v balíku javax.xml.parsers Aplikace jejím prostřednictvím získávají parser, který vytváří stromy DOM objektů z XML dokumentů V distribuci JDK je jen jedna neabstraktní implementace od firmy Apache v balíku org.apache.crimson.jaxp
Diagram tříd – DocumentBuilderFactory