Programmering

Fabriksmetoder

Spørgsmål: Mens jeg gennemgik "Polymorfisme i sin reneste form", så jeg den ukendte betegnelse fabriksmetode. Kan du venligst beskrive, hvad en fabriksmetode er, og forklare, hvordan jeg kan bruge den?

EN: Lad os overveje et eksempel.

Hvert program har brug for en måde at rapportere fejl på. Overvej følgende grænseflade:

Liste 1

offentlig grænseflade Spor {// tænder og slukker for debugging public void setDebug (boolsk debug) // skriv en fejlretningsmeddelelse offentlig ugyldig fejlretning (streng besked); // udskrive en fejlmeddelelse offentlig ugyldig fejl (strengmeddelelse); } 

Antag at du har skrevet to implementeringer. En implementering (Listing 2) skriver beskederne ud til kommandolinjen, mens en anden (Listing 3) skriver dem til en fil.

Liste 2

offentlig klasse FileTrace implementerer Trace {private java.io.PrintWriter pw; privat boolsk debug; offentlig FileTrace () kaster java.io.IOException {// en reel FileTrace ville have brug for at få filnavnet et eller andet sted // for eksempel vil jeg hardcode det pw = new java.io.PrintWriter (new java.io.FileWriter (" c: \ trace.log ")); } public void setDebug (boolsk debug) {this.debug = debug; } public void debug (String message) {if (debug) {// print kun hvis debug er sand pw.println ("DEBUG:" + meddelelse); pw.flush (); }} offentlig ugyldig fejl (streng besked) {// udskriv altid fejl pw.println ("FEJL:" + besked); pw.flush (); }} 

Liste 3

offentlig klasse SystemTrace implementerer Trace {privat boolsk debug; public void setDebug (boolsk debug) {this.debug = debug; } public void debug (String message) {if (debug) {// print kun hvis debug er sand System.out.println ("DEBUG:" + meddelelse); }} offentlig ugyldig fejl (streng besked) {// udskriv altid fejl System.out.println ("FEJL:" + besked); }} 

For at bruge en af ​​disse klasser skal du gøre følgende:

Liste 4

// ... noget kode ... SystemTrace log = ny SystemTrace (); // ... kode ... log.debug ("indtastning af loog"); // ... etc ... 

Nu, hvis du vil ændre Spor implementering, som dit program bruger, skal du redigere hver klasse, der instantierer en Spor implementering. Afhængig af antallet af klasser, der bruger Spor, det kan tage meget arbejde for dig at foretage ændringen. Plus, du vil undgå at ændre dine klasser så meget som muligt.

En fabriksmetode lader os være meget smartere om, hvordan vores klasser opnår Spor implementeringsforekomster:

Liste 5

offentlig klasse TraceFactory {offentlig statisk Trace getTrace () {returner ny SystemTrace (); }} 

getTrace () er en fabriksmetode. Nu, når du ønsker at få en henvisning til en Spor, du kan bare ringe TraceFactory.getTrace ():

Liste 6

// ... noget kode ... Trace log = new TraceFactory.getTrace (); // ... kode ... log.debug ("indtastning af loog"); // ... etc ... 

Brug af en fabriksmetode til at opnå en forekomst kan spare dig for meget arbejde senere. I koden ovenfor, TraceFactory vender tilbage SystemTrace tilfælde. Forestil dig igen, at dine krav ændres, og at du skal skrive dine meddelelser til en fil. Men hvis du bruger en fabriksmetode til at få din forekomst, skal du kun foretage en ændring i en klasse for at imødekomme de nye krav. Du behøver ikke foretage ændringer i hver klasse, der bruger Spor. I stedet kan du blot omdefinere getTrace ():

Liste 7

offentlig klasse TraceFactory {offentlig statisk Trace getTrace () {prøv {returner ny FileTrace (); } fange (java.io.IOException ex) {Trace t = new SystemTrace (); t.error ("kunne ikke instantiere FileTrace:" + ex.getMessage ()); returnere t; }}} 

Desuden viser fabriksmetoder sig nyttige, når du ikke er sikker på, hvilken konkret implementering af en klasse der skal instantieres. I stedet kan du overlade disse detaljer til fabriksmetoden.

I ovenstående eksempler vidste dit program ikke, om det skulle oprettes FileTrace eller SystemTrace tilfælde. I stedet kan du programmere dine objekter til blot at bruge Spor og overlade instantiering af den konkrete implementering til en fabriksmetode.

Tony Sintes er hovedkonsulent hos BroadVision. En Sun-certificeret Java 1.1-programmør og Java 2-udvikler, han har arbejdet med Java siden 1997.

Lær mere om dette emne

  • Det første stop for alle dine mønsterbehov findes i den berømte Gang of Four-bogDesignmønstre, Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley, 1995)

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

  • Ønsker mere? Se Java Q&A indeks for det fulde Q&A katalog

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

  • For mere end 100 indsigtsfulde Java-tip fra nogle af de bedste sind i branchen, besøg JavaWorld 's Java-tip indeks

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

  • For flere artikler, der er rettet mod nye Java-programmører, besøg Introduktionsniveau sektion af JavaWorld's Aktuelle indeks

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

  • Tal ud i Java Nybegynder diskussion

    //www.itworld.com/jump/jw-javaqa/forums.itworld.com/webx?14@@.ee6b804/1195!skip=1125

  • Modtag ugentlige Java-programmeringstip ved at abonnere på vores gratis Java-vejleder e-mail-nyhedsbrev

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

Denne historie, "Fabriksmetoder" blev oprindeligt udgivet af JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found