Programmering

Fabrikkmetoder

Spørsmål: Mens jeg gikk gjennom "Polymorfisme i sin reneste form", så jeg den ukjente betegnelsen fabrikkmetode. Kan du beskrive hva en fabrikkmetode er og forklare hvordan jeg kan bruke den?

EN: La oss se på et eksempel.

Hvert program trenger en måte å rapportere feil på. Vurder følgende grensesnitt:

Oppføring 1

offentlig grensesnitt Trace {// slå av og på feilsøking offentlig ugyldig setDebug (boolsk feilsøking); // skrive ut en feilsøkingsmelding offentlig ugyldig feilsøking (strengmelding); // skrive ut en feilmelding ugyldig feil (strengmelding); } 

Anta at du har skrevet to implementeringer. En implementering (Listing 2) skriver meldingene til kommandolinjen, mens en annen (Listing 3) skriver dem til en fil.

Oppføring 2

offentlig klasse FileTrace implementerer Trace {private java.io.PrintWriter pw; privat boolsk feilsøking; offentlig FileTrace () kaster java.io.IOException {// en ekte FileTrace trenger å skaffe filnavnet et sted // for eksempel vil jeg hardkode det pw = new java.io.PrintWriter (new java.io.FileWriter (" c: \ trace.log ")); } offentlig ugyldig setDebug (boolsk feilsøking) {this.debug = feilsøking; } offentlig ugyldig feilsøking (strengmelding) {if (feilsøking) {// skriv bare ut hvis feilsøkingen er sann pw.println ("DEBUG:" + melding); pw.flush (); }} offentlig ugyldig feil (strengmelding) {// skriv alltid ut feil pw.println ("FEIL:" + melding); pw.flush (); }} 

Oppføring 3

offentlig klasse SystemTrace implementerer Trace {privat boolsk feilsøking; public void setDebug (boolsk feilsøking) {this.debug = feilsøking; } offentlig ugyldig feilsøking (strengmelding) {if (feilsøking) {// skriv bare ut hvis feilsøkingen er sann System.out.println ("DEBUG:" + melding); }} offentlig ugyldig feil (strengmelding) {// alltid skrive ut feil System.out.println ("FEIL:" + melding); }} 

For å bruke en av disse klassene, må du gjøre følgende:

Oppføring 4

// ... litt kode ... SystemTrace-logg = ny SystemTrace (); // ... kode ... log.debug ("inn i loog"); // ... etc ... 

Nå hvis du vil endre Spor implementeringen som programmet ditt bruker, må du redigere hver klasse som starter en Spor gjennomføring. Avhengig av antall klasser som bruker Spor, det kan ta mye arbeid for deg å gjøre endringen. I tillegg vil du unngå å endre klassene dine så mye som mulig.

En fabrikkmetode lar oss være mye smartere om hvordan klassene våre oppnår Spor implementeringsforekomster:

Oppføring 5

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

getTrace () er en fabrikkmetode. Nå, når du ønsker å få en referanse til a Spor, du kan bare ringe TraceFactory.getTrace ():

Oppføring 6

// ... litt kode ... Trace log = new TraceFactory.getTrace (); // ... kode ... log.debug ("inn i loog"); // ... etc ... 

Å bruke en fabrikkmetode for å skaffe en forekomst kan spare deg for mye arbeid senere. I koden ovenfor, TraceFactory returnerer SystemTrace tilfeller. Tenk deg igjen at kravene dine endres, og at du trenger å skrive meldingene dine til en fil. Imidlertid, hvis du bruker en fabrikkmetode for å få din forekomst, må du bare gjøre en endring i en klasse for å oppfylle de nye kravene. Du trenger ikke å gjøre endringer i hver klasse som bruker Spor. I stedet kan du ganske enkelt omdefinere getTrace ():

Oppføring 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 starte FileTrace:" + ex.getMessage ()); returnere t; }}} 

Videre viser fabrikkmetoder seg nyttige når du ikke er sikker på hvilken konkret implementering av en klasse du skal starte. I stedet kan du overlate disse detaljene til fabrikkmetoden.

I eksemplene ovenfor visste ikke programmet om det skulle opprettes FileTrace eller SystemTrace tilfeller. I stedet kan du programmere objektene dine til å bare bruke Spor og overlate instantiering av den konkrete implementeringen til en fabrikkmetode.

Tony Sintes er hovedkonsulent i BroadVision. En Sun-sertifisert Java 1.1-programmerer og Java 2-utvikler, han har jobbet med Java siden 1997.

Lær mer om dette emnet

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

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

  • Ønsker mer? Se Java Q&A indeks for hele Q&A katalogen

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

  • For mer enn 100 innsiktsfulle Java-tips fra noen av de beste hodene i virksomheten, besøk JavaWorld 's Java-tips indeks

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

  • For flere artikler rettet mot nye Java-programmerere, besøk Introduksjonsnivå seksjon av JavaWorldsin aktuelle indeks

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

  • Snakk ut i Java Nybegynner diskusjon

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

  • Motta ukentlige Java-programmeringstips ved å abonnere på vårt gratis Java-veileder e-post nyhetsbrev

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

Denne historien, "Factory methods" ble opprinnelig utgitt av JavaWorld.

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