Programování

Tovární metody

Otázka: Když jsem procházel „Polymorfismem v jeho nejčistší formě“, viděl jsem neznámou metodu tovární metody. Mohl byste prosím popsat, co je tovární metoda a vysvětlit, jak ji mohu použít?

A: Zvažme příklad.

Každý program potřebuje způsob hlášení chyb. Zvažte následující rozhraní:

Výpis 1

veřejné rozhraní Trace {// zapnutí a vypnutí ladění public void setDebug (logické ladění); // vypíše debugovou zprávu public void debug (String message); // vypíše chybovou zprávu public void error (String message); } 

Předpokládejme, že jste napsali dvě implementace. Jedna implementace (Výpis 2) zapisuje zprávy do příkazového řádku, zatímco jiná (Výpis 3) je zapisuje do souboru.

Výpis 2

veřejná třída FileTrace implementuje Trace {private java.io.PrintWriter pw; soukromé booleovské ladění; public FileTrace () hodí java.io.IOException {// skutečná FileTrace by potřebovala někde získat název souboru // pro příklad to napevno napevno pw = new java.io.PrintWriter (new java.io.FileWriter (" c: \ trace.log ")); } public void setDebug (boolean debug) {this.debug = debug; } public void debug (String message) {if (debug) {// tisknout pouze v případě, že debug je true pw.println ("DEBUG:" + zpráva); pw.flush (); }} public void error (String message) {// vždy vytiskni chyby pw.println ("ERROR:" + message); pw.flush (); }} 

Výpis 3

veřejná třída SystemTrace implementuje Trace {private boolean debug; public void setDebug (boolean debug) {this.debug = debug; } public void debug (String message) {if (debug) {// tisknout pouze v případě, že je debug true System.out.println ("DEBUG:" + zpráva); }} public void error (String message) {// vždy vytiskni chyby System.out.println ("ERROR:" + message); }} 

Chcete-li použít některou z těchto tříd, budete muset provést následující:

Výpis 4

// ... nějaký kód ... SystemTrace log = new SystemTrace (); // ... kód ... log.debug ("zadávání loogu"); // ... atd ... 

Nyní, pokud chcete změnit Stopa implementace, kterou váš program používá, budete muset upravit každou třídu, která vytváří instanci a Stopa implementace. V závislosti na počtu tříd, které používají Stopa, provést změnu může hodně práce. Navíc se chcete vyhnout tomu, abyste co nejvíce změnili své hodiny.

Tovární metoda nám umožňuje být mnohem chytřejší v tom, jak naše třídy získávají Stopa instance implementace:

Výpis 5

veřejná třída TraceFactory {public static Trace getTrace () {vrátit nový SystemTrace (); }} 

getTrace () je tovární metoda. Nyní, kdykoli chcete získat odkaz na a Stopa, můžete jednoduše zavolat TraceFactory.getTrace ():

Výpis 6

// ... nějaký kód ... Trace log = new TraceFactory.getTrace (); // ... kód ... log.debug ("zadávání loogu"); // ... atd ... 

Použití tovární metody k získání instance vám může později ušetřit spoustu práce. V kódu výše, TraceFactory se vrací SystemTrace instance. Představte si znovu, že se vaše požadavky mění a že musíte své zprávy zapsat do souboru. Pokud však k získání instance použijete tovární metodu, musíte v jedné třídě provést pouze jednu změnu, abyste splnili nové požadavky. Nemusíte provádět změny v každé třídě, která používá Stopa. Místo toho můžete jednoduše předefinovat getTrace ():

Výpis 7

public class TraceFactory {public static Trace getTrace () {try {return new FileTrace (); } catch (java.io.IOException ex) {Trace t = new SystemTrace (); t.error ("nelze vytvořit instanci FileTrace:" + ex.getMessage ()); návrat t; }}} 

Dále se tovární metody osvědčily, když si nejste jisti, jakou konkrétní implementaci třídy vytvořit instanci. Místo toho můžete tyto podrobnosti ponechat na tovární metodu.

Ve výše uvedených příkladech váš program nevěděl, zda má vytvořit FileTrace nebo SystemTrace instance. Místo toho můžete své objekty naprogramovat tak, aby se jednoduše používaly Stopa a ponechat instanci konkrétní implementace na tovární metodu.

Tony Sintes je hlavním konzultantem společnosti BroadVision. Sun-certifikovaný programátor Java 1.1 a vývojář Java 2, pracoval s Java od roku 1997.

Další informace o tomto tématu

  • První zastávku pro všechny vaše potřeby vzoru najdete ve slavné knize Gang of FourDesignové vzory, Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley, 1995)

    //www.amazon.com/exec/obidos/ASIN/0201633612/javaworld

  • Chcete více? Viz Java Q&A index pro celý katalog otázek a odpovědí

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Pro více než 100 bystrých tipů pro Javu od nejlepších odborníků v oboru navštivte JavaWorld 's Tipy pro Java index

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Další články zaměřené na nové programátory Java najdete na webu Úvodní úroveň část JavaWorldAktuální rejstřík

    //www.javaworld.com/javaworld/topicalindex/jw-ti-introlevel.html

  • Mluvte v Java začátečník diskuse

    //www.itworld.com/jump/jw-javaqa/forums.itworld.com/[email protected]@.ee6b804/1195!skip=1125

  • Přihlaste se k odběru našich bezplatných týdenních tipů na programování v jazyce Java Java Tutor e-mailový zpravodaj

    //reg.itworld.com/cgi-bin/subcontent12.cgi

Tento příběh, „Tovární metody“, původně publikoval JavaWorld.