Tvorničke metode

P: Prolazeći kroz "Polimorfizam u najčišćem obliku", vidio sam nepoznati izraz tvornička metoda. Možete li, molim vas, opisati što je tvornička metoda i objasniti kako je mogu koristiti?

O: Razmotrimo primjer.

Svaki program treba način za prijavljivanje pogrešaka. Razmotrite sljedeće sučelje:

Popis 1

javno sučelje Trace {// uključivanje i isključivanje ispravljanja pogrešaka javna praznina setDebug (logički ispravljač); // ispisati poruku za otklanjanje pogrešaka public void debug (String message); // ispisati poruku o pogrešci public void error (string poruka); }

Pretpostavimo da ste napisali dvije implementacije. Jedna implementacija (Popis 2) zapisuje poruke u naredbeni redak, dok ih druga (Popis 3) zapisuje u datoteku.

Popis 2

javna klasa FileTrace implementira Trace {private java.io.PrintWriter pw; privatni booleov otklanjanje pogrešaka; public FileTrace () baca java.io.IOException {// pravi FileTrace trebao bi negdje dobiti naziv datoteke // za primjer ću ga tvrdo kodirati pw = new java.io.PrintWriter (new java.io.FileWriter (" c: \ trace.log ")); } javna void setDebug (boolean debug) {this.debug = debug; } javni void otklanjanje pogrešaka (niz poruka) {if (otklanjanje pogrešaka) {// ispis samo ako je otklanjanje pogrešaka istinito pw.println ("DEBUG:" + poruka); pw.flush (); }} javna void pogreška (string poruka) {// uvijek ispisati pogreške pw.println ("ERROR:" + poruka); pw.flush (); }}

Popis 3

javna klasa SystemTrace implementira Trace {private boolean debug; javna void setDebug (boolean debug) {this.debug = debug; } javni void otklanjanje pogrešaka (niz poruka) {if (otklanjanje pogrešaka) {// ispis samo ako je ispravljanje pogrešaka istinito System.out.println ("DEBUG:" + poruka); }} pogreška javne praznine (poruka niza) {// uvijek ispiši pogreške System.out.println ("POGREŠKA:" + poruka); }}

Da biste koristili bilo koju od ovih klasa, trebat ćete učiniti sljedeće:

Popis 4

// ... neki kod ... SystemTrace log = novi SystemTrace (); // ... kod ... log.debug ("unos dnevnika"); // ... itd ...

Sada ako želite promijeniti Traceimplementaciju koju vaš program koristi, morat ćete urediti svaku klasu koja pokreće instalaciju Trace. Ovisno o broju predavanja koja koriste Trace, moglo bi vam trebati puno posla da napravite promjenu. Osim toga, želite izbjeći da što više mijenjate nastavu.

Tvornička metoda omogućuje nam da budemo puno pametniji u načinu na koji naše klase dobivaju Traceinstance implementacije:

Popis 5

javna klasa TraceFactory {public static Trace getTrace () {return new SystemTrace (); }}

getTrace()je tvornička metoda. Sada, kad god želite dobiti referencu na a Trace, možete jednostavno nazvati TraceFactory.getTrace():

Popis 6

// ... neki kod ... Dnevnik praćenja = novi TraceFactory.getTrace (); // ... kod ... log.debug ("unos dnevnika"); // ... itd ...

Korištenje tvorničke metode za dobivanje instance može vam uštedjeti puno posla kasnije. U gornjem kodu TraceFactoryvraća SystemTraceinstance. Zamislite opet da se vaši zahtjevi mijenjaju i da svoje poruke morate zapisati u datoteku. Međutim, ako za dobivanje instance koristite tvorničku metodu, trebate unijeti samo jednu promjenu u jednu klasu kako biste udovoljili novim zahtjevima. Ne morate mijenjati svaki razred koji koristi Trace. Umjesto toga možete jednostavno redefinirati getTrace():

Popis 7

javna klasa TraceFactory {public static Trace getTrace () {try {return new FileTrace (); } catch (java.io.IOException ex) {Trace t = novi SystemTrace (); t.error ("instanca FileTrace nije uspjela:" + ex.getMessage ()); povrat t; }}}

Nadalje, tvorničke metode pokazuju se korisnima kada niste sigurni koju konkretnu implementaciju klase treba izraditi. Umjesto toga, te detalje možete prepustiti tvorničkoj metodi.

U gornjim primjerima vaš program nije znao treba li kreirati FileTraceili SystemTraceinstance. Umjesto toga, možete programirati svoje objekte tako da ih jednostavno koriste Tracei prepuštaju instanciranje konkretne implementacije tvorničkoj metodi.

Tony Sintes glavni je savjetnik u BroadVisionu. Sunce certificirani programer Java 1.1 i programer Java 2, radio je s Javom od 1997.

Saznajte više o ovoj temi

  • Prvo zaustavljanje za sve vaše potrebe uzoraka možete pronaći u poznatoj Gang of Four book Design Patterns, Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley, 1995)

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

  • Želite više? Pogledajte cjeloviti katalog Pitanja za Java

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

  • Za više od 100 uvida Java savjete iz neke od najboljih umova u poslovanju, posjet JavaWorld” s Java Savjet indeks

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

  • Za dodatne članke usmjerena prema novim Java programera, posjetite Uvod Level dio JavaWorld „s tematske Index

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

  • Govorite u raspravi o početnicima Java

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

  • Primajte tjedne savjete za programiranje Java pretplaćujući se na naš besplatni bilten Java Tutor

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

Ovu priču, "Tvorničke metode" izvorno je objavio JavaWorld.