Programavimas

Gamyklos metodai

Klausimas: Nors išgyvenau „gryniausios formos polimorfizmą“, pamačiau nepažįstamą „fabriko metodo“ terminą. Ar galėtumėte apibūdinti, kas yra gamyklinis metodas, ir paaiškinti, kaip aš galiu jį naudoti?

A: Panagrinėkime pavyzdį.

Kiekvienai programai reikia pranešti apie klaidas. Apsvarstykite šią sąsają:

1 sąrašas

viešoji sąsaja „Trace“ {// įjungti ir išjungti derinimą „public void setDebug“ („Boolean“ derinimas); // rašyti derinimo pranešimą public void debug (String message); // išrašyti klaidos pranešimą public void error (String message); } 

Tarkime, kad parašėte du įgyvendinimus. Vienas diegimas (2 sąrašas) išrašo pranešimus į komandinę eilutę, o kitas (3 sąrašas) - į failą.

2 sąrašas

viešoji klasė „FileTrace“ įgyvendina „Trace“ {privatų java.io.PrintWriter pw; privatus loginis derinimas; public FileTrace () meta java.io.IOException {// tikram FileTrace reikėtų kažkur gauti failo pavadinimą // pavyzdyje aš jį sunkiai užkoduosiu pw = new java.io.PrintWriter (nauja java.io.FileWriter (" c: \ trace.log ")); } public void setDebug (loginis derinimas) {this.debug = derinimas; } public void debug (String message) {if (derinti) {// spausdinti tik tuo atveju, jei derinimas yra teisingas pw.println ("DEBUG:" + pranešimas); pw.flush (); }} public void error (String message) {// visada atspausdinti klaidas pw.println ("KLAIDA:" + pranešimas); pw.flush (); }} 

3 sąrašas

viešoji klasė „SystemTrace“ įgyvendina „Trace“ {privatų loginį derinimą; public void setDebug (loginis derinimas) {this.debug = derinimas; } public void debug (String message) {if (debug) {// spausdinti tik tuo atveju, jei derinimas yra tikras System.out.println ("DEBUG:" + pranešimas); }} public void error (String message) {// visada atsispausdinti klaidas System.out.println ("KLAIDA:" + pranešimas); }} 

Norėdami naudoti bet kurią iš šių klasių, turėsite atlikti šiuos veiksmus:

4 sąrašas

// ... tam tikras kodas ... SystemTrace log = new SystemTrace (); // ... kodas ... log.debug ("įvedimas loog"); // ... ir tt ... 

Dabar, jei norite pakeisti Pėdsakas diegimą, kurį naudoja jūsų programa, turėsite redaguoti kiekvieną klasę, kuri sukuria a Pėdsakas įgyvendinimas. Priklauso nuo naudojamų klasių skaičiaus Pėdsakas, norint pakeisti, gali prireikti daug darbo. Be to, jūs norite kuo labiau išvengti savo klasių keitimo.

Gamyklinis metodas leidžia mums būti kur kas protingesniais, kaip pasiekiamos mūsų klasės Pėdsakas įgyvendinimo egzemplioriai:

5 sąrašas

public class TraceFactory {public static Trace getTrace () {grąžinti naują SystemTrace (); }} 

„getTrace“ () yra gamyklinis metodas. Dabar, kai tik norite gauti nuorodą į a Pėdsakas, galite tiesiog paskambinti „TraceFactory.getTrace“ ():

6 sąrašas

// ... tam tikras kodas ... Pėdsakų žurnalas = new TraceFactory.getTrace (); // ... kodas ... log.debug ("įvedimas loog"); // ... ir tt ... 

Gamyklos metodo naudojimas egzemplioriui gauti gali sutaupyti daug darbo vėliau. Aukščiau pateiktame kode „TraceFactory“ grįžta „SystemTrace“ atvejų. Dar kartą įsivaizduokite, kad jūsų reikalavimai pasikeičia ir kad jums reikia rašyti savo pranešimus į failą. Tačiau jei egzemplioriui gauti naudojate gamyklinį metodą, vienoje klasėje turite atlikti tik vieną pakeitimą, kad atitiktumėte naujus reikalavimus. Jums nereikia atlikti pakeitimų kiekvienoje naudojamoje klasėje Pėdsakas. Vietoj to galite tiesiog iš naujo apibrėžti „getTrace“ ():

7 sąrašas

public class TraceFactory {public static Trace getTrace () {try {return new FileTrace (); } gaudyti (java.io.IOException ex) {Trace t = new SystemTrace (); t.error ("nepavyko užfiksuoti FileTrace:" + ex.getMessage ()); grįžti t; }}} 

Be to, gamykliniai metodai yra naudingi, kai nesate tikri, kokį konkretų klasės įgyvendinimą reikia išryškinti. Vietoj to, galite palikti šias detales pagal gamyklos metodą.

Ankstesniuose pavyzdžiuose jūsų programa nežinojo, ar kurti „FileTrace“ arba „SystemTrace“ atvejų. Vietoj to, jūs galite užprogramuoti savo objektus tiesiog naudoti Pėdsakas o konkretaus įgyvendinimo momentą palikite gamyklos metodui.

Tony Sintesas yra pagrindinis „BroadVision“ konsultantas. „Sun 1.1“ sertifikuotas „Java 1.1“ programuotojas ir „Java 2“ kūrėjas su „Java“ dirbo nuo 1997 m.

Sužinokite daugiau apie šią temą

  • Pirmąją stotelę visiems jūsų modelio poreikiams rasite garsiojoje „Keturių gaujos“ knygojeDizaino modeliai, Ericas Gamma, Richardas Helmas, Ralphas Johnsonas, Johnas Vlissidesas (Addison-Wesley, 1995)

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

  • Norite daugiau? Žr „Java“ klausimai ir atsakymai viso klausimų ir atsakymų katalogo rodyklė

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

  • Norėdami gauti daugiau nei 100 įžvalgių „Java“ patarimų iš geriausių verslo atstovų, apsilankykite „JavaWorld“s „Java“ patarimai indeksas

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

  • Daugiau straipsnių, skirtų naujiems „Java“ programuotojams, rasite apsilankę Įvadinis lygis skyrius „JavaWorld“aktuali rodyklė

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

  • Kalbėk „Java“ pradedantysis diskusija

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

  • Gaukite savaitinius „Java“ programavimo patarimus užsiprenumeruodami nemokamą mūsų programą „Java“ mokytojas pašto naujienlaiškis

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

Šią istoriją „Gamyklos metodai“ iš pradžių paskelbė „JavaWorld“.

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