Metode pabrik

T: Saat menjalani "Polimorfisme dalam bentuknya yang paling murni", saya melihat metode pabrik istilah yang tidak dikenal. Bisakah Anda menjelaskan apa itu metode pabrik dan menjelaskan bagaimana saya dapat menggunakannya?

J: Mari pertimbangkan sebuah contoh.

Setiap program membutuhkan cara untuk melaporkan kesalahan. Pertimbangkan antarmuka berikut:

Daftar 1

public interface Trace {// hidupkan dan matikan debugging public void setDebug (boolean debug); // tulis pesan debug public void debug (String message); // tulis pesan error public void error (String message); }

Misalkan Anda telah menulis dua implementasi. Satu implementasi (Daftar 2) menulis pesan ke baris perintah, sementara yang lain (Daftar 3) menulisnya ke sebuah file.

Daftar 2

public class FileTrace mengimplementasikan Trace {private java.io.PrintWriter pw; debug boolean pribadi; public FileTrace () melempar java.io.IOException {// FileTrace yang sebenarnya perlu mendapatkan nama file di suatu tempat // sebagai contoh saya akan membuat hardcode pw = new java.io.PrintWriter (new java.io.FileWriter (" c: \ trace.log ")); } public void setDebug (boolean debug) {this.debug = debug; } public void debug (String message) {if (debug) {// hanya mencetak jika debug benar pw.println ("DEBUG:" + message); pw.flush (); }} kesalahan public void (pesan string) {// selalu mencetak kesalahan pw.println ("ERROR:" + pesan); pw.flush (); }}

Daftar 3

public class SystemTrace mengimplementasikan Trace {private boolean debug; public void setDebug (boolean debug) {this.debug = debug; } public void debug (String message) {if (debug) {// hanya mencetak jika debug benar System.out.println ("DEBUG:" + message); }} public void error (String message) {// selalu mencetak error System.out.println ("ERROR:" + message); }}

Untuk menggunakan salah satu dari kelas ini, Anda perlu melakukan hal berikut:

Daftar 4

// ... beberapa kode ... SystemTrace log = new SystemTrace (); // ... code ... log.debug ("memasuki loog"); // ... dll ...

Sekarang jika Anda ingin mengubah Traceimplementasi yang digunakan program Anda, Anda harus mengedit setiap kelas yang membuat Traceimplementasi. Bergantung pada jumlah kelas yang digunakan Trace, mungkin perlu banyak pekerjaan bagi Anda untuk membuat perubahan. Plus, Anda ingin menghindari mengubah kelas Anda sebanyak mungkin.

Metode pabrik memungkinkan kita menjadi lebih pintar tentang bagaimana kelas kita mendapatkan Tracecontoh implementasi:

Daftar 5

kelas publik TraceFactory {public static Trace getTrace () {return new SystemTrace (); }}

getTrace()adalah metode pabrik. Sekarang, kapan pun Anda ingin mendapatkan referensi ke a Trace, Anda cukup memanggil TraceFactory.getTrace():

Daftar 6

// ... beberapa kode ... Trace log = new TraceFactory.getTrace (); // ... code ... log.debug ("memasuki loog"); // ... dll ...

Menggunakan metode pabrik untuk mendapatkan instance dapat menghemat banyak pekerjaan nanti. Dalam kode di atas, TraceFactorymengembalikan SystemTraceinstance. Bayangkan lagi bahwa kebutuhan Anda berubah dan Anda perlu menuliskan pesan Anda ke sebuah file. Namun, jika Anda menggunakan metode pabrik untuk mendapatkan instans Anda, Anda hanya perlu membuat satu perubahan dalam satu kelas untuk memenuhi persyaratan baru. Anda tidak perlu melakukan perubahan di setiap kelas yang menggunakan Trace. Sebagai gantinya, Anda cukup mendefinisikan ulang getTrace():

Daftar 7

public class TraceFactory {public static Trace getTrace () {try {return new FileTrace (); } catch (java.io.IOException ex) {Trace t = new SystemTrace (); t.error ("tidak dapat membuat instance FileTrace:" + ex.getMessage ()); kembali t; }}}

Selanjutnya, metode pabrik terbukti berguna saat Anda tidak yakin implementasi konkret apa dari kelas yang akan dibuat. Sebagai gantinya, Anda dapat menyerahkan detail tersebut ke metode pabrik.

Dalam contoh di atas, program Anda tidak tahu apakah akan membuat FileTraceatau SystemTraceinstance. Sebagai gantinya, Anda dapat memprogram objek Anda untuk digunakan dengan mudah Tracedan membiarkan instance implementasi konkret ke metode pabrik.

Tony Sintes adalah konsultan utama di BroadVision. Seorang programmer Java 1.1 bersertifikat Sun dan pengembang Java 2, dia telah bekerja dengan Java sejak 1997.

Pelajari lebih lanjut tentang topik ini

  • Pemberhentian pertama untuk semua kebutuhan pola Anda dapat ditemukan di buku Pola Desain Gang of Four yang terkenal , Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley, 1995)

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

  • Ingin lebih? Lihat indeks Q&A Java untuk katalog Q&A lengkap

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

  • Selama lebih dari 100 kiat Jawa wawasan dari beberapa pikiran terbaik dalam bisnis ini, kunjungan JavaWorld' s Java Tips indeks

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

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

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

  • Bicaralah dalam diskusi Pemula Java

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

  • Dapatkan tips pemrograman Java mingguan dengan berlangganan buletin email Java Tutor gratis kami

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

Cerita ini, "Metode pabrik", awalnya diterbitkan oleh JavaWorld.