Kaedah kilang

S: Semasa melalui "Polimorfisme dalam bentuknya yang paling murni," saya melihat kaedah kilang istilah yang tidak dikenali. Bolehkah anda menerangkan kaedah kilang dan menerangkan bagaimana saya boleh menggunakannya?

J: Mari kita pertimbangkan satu contoh.

Setiap program memerlukan kaedah untuk melaporkan kesilapan. Pertimbangkan antara muka berikut:

Penyenaraian 1

Jejak antara muka awam {// nyalakan dan matikan penyahpepijatan awam void setDebug (debug boolean); // tuliskan mesej debug public vug debug (String message); // tuliskan mesej ralat ralat kekosongan awam (String message); }

Katakan anda telah menulis dua pelaksanaan. Satu pelaksanaan (Penyenaraian 2) menuliskan pesan ke baris perintah, sementara yang lain (Penyenaraian 3) menulisnya ke file.

Penyenaraian 2

FileTrace kelas awam mengimplementasikan Trace {private java.io.PrintWriter pw; debug peribadi boolean; awam FileTrace () melemparkan java.io.IOException {// sebenarnya FileTrace perlu mendapatkan nama fail di suatu tempat // untuk contoh saya akan memasukkannya dengan pw = java.io.PrintWriter baru (java.io.FileWriter baru (" c: \ trace.log ")); } public void setDebug (debug boolean) {this.debug = debug; } debug kekosongan awam (String message) {if (debug) {// hanya cetak jika debug benar pw.println ("DEBUG:" + message); pw.flush (); }} ralat kekosongan awam (String message) {// selalu mencetak ralat pw.println ("ERROR:" + message); pw.flush (); }}

Penyenaraian 3

kelas awam SystemTrace melaksanakan Trace {debug boolean peribadi; public void setDebug (debug boolean) {this.debug = debug; } debug kekosongan awam (String message) {if (debug) {// hanya cetak jika debug benar System.out.println ("DEBUG:" + message); }} ralat kekosongan awam (String message) {// selalu mencetak kesalahan System.out.println ("ERROR:" + message); }}

Untuk menggunakan salah satu daripada kelas ini, anda perlu melakukan perkara berikut:

Penyenaraian 4

// ... beberapa kod ... log SystemTrace = SystemTrace baru (); // ... kod ... log.debug ("memasuki loog"); // ... dan lain-lain ...

Sekarang jika anda ingin mengubah Traceimplementasi yang digunakan oleh program anda, anda perlu mengedit setiap kelas yang mewujudkan Tracepelaksanaan. Bergantung pada jumlah kelas yang menggunakan Trace, anda mungkin memerlukan banyak kerja untuk membuat perubahan. Selain itu, anda mahu mengelakkan mengubah kelas anda sebanyak mungkin.

Kaedah kilang membolehkan kita lebih pintar mengenai bagaimana kelas kita memperoleh Tracecontoh pelaksanaan:

Penyenaraian 5

kelas awam TraceFactory {public static Trace getTrace () {kembali SystemTrace baru (); }}

getTrace()adalah kaedah kilang. Sekarang, setiap kali anda ingin mendapatkan rujukan ke Trace, anda boleh menghubungi TraceFactory.getTrace():

Penyenaraian 6

// ... beberapa kod ... Log jejak = TraceFactory.getTrace baru (); // ... kod ... log.debug ("memasuki loog"); // ... dan lain-lain ...

Menggunakan kaedah kilang untuk mendapatkan contoh dapat menjimatkan banyak kerja anda kemudian. Dalam kod di atas, TraceFactorymengembalikan SystemTracecontoh. Bayangkan sekali lagi bahawa keperluan anda berubah dan anda perlu menuliskan mesej anda ke fail. Namun, jika anda menggunakan kaedah kilang untuk mendapatkan contoh anda, anda hanya perlu membuat satu perubahan dalam satu kelas untuk memenuhi syarat baru. Anda tidak perlu membuat perubahan di setiap kelas yang menggunakan Trace. Sebaliknya anda boleh mentakrifkan semula getTrace():

Penyenaraian 7

kelas awam TraceFactory {public static Trace getTrace () {cuba {kembalikan FileTrace baru (); } tangkapan (java.io.IOException ex) {Trace t = SystemTrace baru (); t.error ("tidak dapat memberi contoh FileTrace:" + ex.getMessage ()); pulangan t; }}}

Selanjutnya, kaedah kilang terbukti berguna apabila anda tidak pasti pelaksanaan konkrit dari kelas yang hendak dibuat. Sebaliknya, anda boleh menyerahkan butiran tersebut kepada kaedah kilang.

Dalam contoh di atas, program anda tidak tahu akan membuat FileTraceatau membuat SystemTracecontoh. Sebagai gantinya, anda boleh memprogramkan objek anda hanya untuk menggunakan Tracedan membiarkan contoh pelaksanaan konkrit kepada kaedah kilang.

Tony Sintes adalah perunding utama di BroadVision. Pengaturcara Java 1.1 yang disahkan oleh Sun dan pengembang Java 2, dia telah bekerja dengan Java sejak tahun 1997.

Ketahui lebih lanjut mengenai topik ini

  • Tempat persinggahan pertama untuk semua keperluan corak anda terdapat di buku Corak Reka Bentuk Empat yang terkenal , Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley, 1995)

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

  • Mahu lebih? Lihat indeks Soal Jawab Java untuk katalog Q&A lengkap

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

  • Selama lebih 100 tips Java berwawasan dari beberapa minda terbaik dalam perniagaan, lawatan JavaWorld ' s Java Tips indeks

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

  • Untuk lebih banyak artikel yang ditujukan untuk programmer Java baru, kunjungi bahagian Intro Level dari Indeks Topikal JavaWorld

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

  • Bercakap dalam perbincangan Pemula Java

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

  • Terima petua pengaturcaraan Java mingguan dengan melanggan buletin e-mel Java Tutor percuma kami

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

Kisah ini, "Kaedah kilang" pada awalnya diterbitkan oleh JavaWorld.