Fabrikmethoden

F: Während ich "Polymorphismus in seiner reinsten Form" durchging, sah ich den unbekannten Begriff Fabrikmethode. Könnten Sie bitte beschreiben, was eine Factory-Methode ist und wie ich sie verwenden kann?

A: Betrachten wir ein Beispiel.

Jedes Programm benötigt eine Möglichkeit, Fehler zu melden. Betrachten Sie die folgende Schnittstelle:

Listing 1:

öffentliche Schnittstelle Trace {// Debugging ein- und ausschalten public void setDebug (boolean debug); // eine Debug-Nachricht schreiben public void debug (String message); // schreibe eine Fehlermeldung aus public void error (String message); }}

Angenommen, Sie haben zwei Implementierungen geschrieben. Eine Implementierung (Listing 2) schreibt die Nachrichten in die Befehlszeile, während eine andere (Listing 3) sie in eine Datei schreibt.

Listing 2:

öffentliche Klasse FileTrace implementiert Trace {private java.io.PrintWriter pw; privates boolesches Debug; public FileTrace () löst java.io.IOException aus {// eine echte FileTrace müsste den Dateinamen irgendwo erhalten // für das Beispiel werde ich ihn fest codieren pw = new java.io.PrintWriter (new java.io.FileWriter (" c: \ trace.log ")); } public void setDebug (boolesches Debug) {this.debug = debug; } public void debug (String message) {if (debug) {// nur drucken, wenn das Debug wahr ist pw.println ("DEBUG:" + message); pw.flush (); }} public void error (String message) {// drucke immer Fehler aus pw.println ("ERROR:" + message); pw.flush (); }}

Listing 3:

öffentliche Klasse SystemTrace implementiert Trace {privates boolesches Debug; public void setDebug (boolesches Debug) {this.debug = debug; } public void debug (String message) {if (debug) {// nur drucken, wenn das Debug wahr ist System.out.println ("DEBUG:" + message); }} public void error (String message) {// drucke immer Fehler aus System.out.println ("ERROR:" + message); }}

Um eine dieser Klassen zu verwenden, müssten Sie Folgendes tun:

Listing 4:

// ... etwas Code ... SystemTrace log = new SystemTrace (); // ... code ... log.debug ("Eingabe von Loog"); // ... usw ...

Wenn Sie nun die von TraceIhrem Programm verwendete Implementierung ändern möchten , müssen Sie jede Klasse bearbeiten, die eine TraceImplementierung instanziiert . Abhängig von der Anzahl der verwendeten Klassen Tracekann es viel Arbeit kosten, die Änderung vorzunehmen. Außerdem möchten Sie vermeiden, Ihre Klassen so weit wie möglich zu ändern.

Mit einer Factory-Methode können wir viel intelligenter darüber sein, wie unsere Klassen TraceImplementierungsinstanzen erhalten :

Listing 5:

öffentliche Klasse TraceFactory {public static Trace getTrace () {neues SystemTrace () zurückgeben; }}

getTrace()ist eine Fabrikmethode. Wenn Sie jetzt einen Verweis auf a erhalten möchten Trace, können Sie einfach anrufen TraceFactory.getTrace():

Listing 6:

// ... etwas Code ... Trace log = new TraceFactory.getTrace (); // ... code ... log.debug ("Eingabe von Loog"); // ... usw ...

Die Verwendung einer Factory-Methode zum Abrufen einer Instanz kann Ihnen später viel Arbeit ersparen. In dem obigen Code, TraceFactorykehrt SystemTraceInstanzen. Stellen Sie sich erneut vor, dass sich Ihre Anforderungen ändern und Sie Ihre Nachrichten in eine Datei schreiben müssen. Wenn Sie jedoch eine Factory-Methode verwenden, um Ihre Instanz abzurufen, müssen Sie nur eine Änderung in einer Klasse vornehmen, um die neuen Anforderungen zu erfüllen. Sie müssen nicht in jeder verwendeten Klasse Änderungen vornehmen Trace. Stattdessen können Sie einfach neu definieren getTrace():

Listing 7:

öffentliche Klasse TraceFactory {public static Trace getTrace () {try {neues FileTrace () zurückgeben; } catch (java.io.IOException ex) {Trace t = new SystemTrace (); t.error ("konnte FileTrace nicht instanziieren:" + ex.getMessage ()); return t; }}}

Darüber hinaus erweisen sich Factory-Methoden als nützlich, wenn Sie nicht sicher sind, welche konkrete Implementierung einer Klasse instanziiert werden soll. Stattdessen können Sie diese Details der Factory-Methode überlassen.

In den obigen Beispielen Ihr Programm wissen nicht , ob zu erstellen FileTraceoder SystemTraceInstanzen. Stattdessen können Sie Ihre Objekte so programmieren, dass Tracesie die Instanziierung der konkreten Implementierung einfach verwenden und einer Factory-Methode überlassen.

Tony Sintes ist Hauptberater bei BroadVision. Als Sun-zertifizierter Java 1.1-Programmierer und Java 2-Entwickler arbeitet er seit 1997 mit Java.

Erfahren Sie mehr über dieses Thema

  • Die erste Anlaufstelle für alle Ihre Musterbedürfnisse finden Sie im berühmten Gang of Four-Buch Design Patterns, Eric Gamma, Richard Helm, Ralph Johnson und John Vlissides (Addison-Wesley, 1995).

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

  • Mehr wollen? Den vollständigen Q & A-Katalog finden Sie im Java Q & A- Index

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

  • Seit mehr als 100 interessanten Java - Tipps von einigen der besten Köpfe im Geschäft, Besuch Javaworld‘ s Java Tipps Index

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

  • Weitere Artikel für neue Java-Programmierer finden Sie im Abschnitt Intro Level des JavaWorld - Themenindex

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

  • Sprechen Sie heraus in der Java Anfänger Diskussion

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

  • Erhalten Sie wöchentliche Java-Programmiertipps, indem Sie unseren kostenlosen Java Tutor- E-Mail-Newsletter abonnieren

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

Diese Geschichte "Factory Methods" wurde ursprünglich von JavaWorld veröffentlicht.