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.
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.