Apa itu metode "pabrik statis"?
java
design-patterns
factory-method
freddiefujiwara
sumber
sumber
Jawaban:
Kami menghindari memberikan akses langsung ke koneksi basis data karena sumber daya yang intensif. Jadi kami menggunakan metode pabrik statis
getDbConnection
yang membuat koneksi jika kami di bawah batas. Kalau tidak, ia mencoba untuk menyediakan koneksi "cadangan", gagal dengan pengecualian jika tidak ada.sumber
The Pola metode pabrik statis adalah cara untuk penciptaan encapsulate objek. Tanpa metode pabrik, Anda hanya akan memanggil kelas itu konstruktor langsung:
Foo x = new Foo()
. Dengan pola ini, Anda malah akan memanggil metode pabrik:Foo x = Foo.create()
. Konstruktor ditandai pribadi, sehingga mereka tidak dapat dipanggil kecuali dari dalam kelas, dan metode pabrik ditandaistatic
sehingga dapat dipanggil tanpa terlebih dahulu memiliki objek.Ada beberapa keuntungan dari pola ini. Pertama adalah bahwa pabrik dapat memilih dari banyak subclass (atau pelaksana antarmuka) dan mengembalikannya. Dengan cara ini penelepon dapat menentukan perilaku yang diinginkan melalui parameter, tanpa harus mengetahui atau memahami hierarki kelas yang berpotensi kompleks.
Keuntungan lain adalah, seperti yang ditunjukkan Matius dan James, mengendalikan akses ke sumber daya terbatas seperti koneksi. Ini cara untuk menerapkan kumpulan objek yang dapat digunakan kembali - alih-alih membangun, menggunakan, dan menghancurkan objek, jika konstruksi dan penghancuran adalah proses yang mahal, mungkin lebih masuk akal untuk membangunnya sekali dan mendaur ulangnya. Metode pabrik dapat mengembalikan objek instantiated yang ada dan tidak terpakai jika memiliki satu, atau membangun satu jika objek menghitung di bawah beberapa ambang bawah, atau melemparkan pengecualian atau kembali
null
jika itu di atas ambang atas.Sesuai artikel di Wikipedia, beberapa metode pabrik juga memungkinkan interpretasi yang berbeda dari tipe argumen yang serupa. Biasanya konstruktor memiliki nama yang sama dengan kelas, yang berarti Anda hanya dapat memiliki satu konstruktor dengan tanda tangan yang diberikan . Pabrik tidak dibatasi, yang berarti Anda dapat memiliki dua metode berbeda yang menerima jenis argumen yang sama:
dan
Ini juga dapat digunakan untuk meningkatkan keterbacaan, seperti yang dicatat oleh Rasmus.
sumber
CATATAN! "The metode pabrik statis adalah TIDAK sama dengan Pabrik Metode pola" (c) Jawa Efektif, Joshua Bloch.
Metode Pabrik: "Tentukan antarmuka untuk membuat objek, tetapi biarkan kelas yang mengimplementasikan antarmuka memutuskan kelas mana yang akan dipakai. Metode Pabrik memungkinkan kelas menunda instantiasi ke subclass" (c) GoF.
"Metode pabrik statis hanyalah metode statis yang mengembalikan instance kelas." (c) Java Efektif, Joshua Bloch. Biasanya metode ini ada di dalam kelas tertentu.
Perbedaan:
Gagasan kunci metode pabrik statis adalah untuk mendapatkan kontrol atas pembuatan objek dan mendelegasikannya dari konstruktor ke metode statis. Keputusan objek yang akan dibuat adalah seperti di Pabrik Abstrak dibuat di luar metode (dalam kasus umum, tetapi tidak selalu). Sedangkan ide kunci (!) Dari Metode Pabrik adalah untuk mendelegasikan keputusan instance kelas apa yang akan dibuat di dalam Metode Pabrik. Misalnya implementasi Singleton klasik adalah kasus khusus metode pabrik statis. Contoh metode statis yang umum digunakan:
sumber
Keterbacaan dapat ditingkatkan dengan metode pabrik statis:
Membandingkan
untuk
sumber
private Foo(boolean withBar){/*..*/}
public static Foo createWithBar(){return new Foo(true);}
public static Foo createWithoutBar(){return new Foo(false);}
dari http://www.javapractices.com/topic/TopicAction.do?Id=21
sumber
Itu semua bermuara pada rawatan. Cara terbaik untuk menempatkan ini adalah setiap kali Anda menggunakan
new
kata kunci untuk membuat objek, Anda menyambungkan kode yang Anda tulis ke implementasi.Pola pabrik memungkinkan Anda memisahkan cara Anda membuat objek dari apa yang Anda lakukan dengan objek. Ketika Anda membuat semua objek Anda menggunakan konstruktor, Anda pada dasarnya mengkabel kode yang menggunakan objek untuk implementasi itu. Kode yang menggunakan objek Anda "tergantung pada" objek itu. Ini mungkin tidak tampak seperti masalah besar di permukaan, tetapi ketika objek berubah (pikirkan untuk mengubah tanda tangan konstruktor, atau subklasifikasi objek), Anda harus kembali dan memperbaiki hal-hal di mana-mana.
Saat ini pabrik-pabrik sebagian besar telah disisihkan untuk menggunakan Injeksi Ketergantungan karena mereka memerlukan banyak kode pelat-ketel yang ternyata agak sulit untuk dipertahankan sendiri. Ketergantungan Injeksi pada dasarnya setara dengan pabrik tetapi memungkinkan Anda untuk menentukan bagaimana benda Anda dihubungkan bersama secara deklaratif (melalui konfigurasi atau anotasi).
sumber
Jika konstruktor suatu kelas bersifat pribadi maka Anda tidak dapat membuat objek untuk kelas dari luarnya.
Kami tidak dapat membuat objek untuk kelas di atas dari luarnya. Jadi Anda tidak dapat mengakses x, y dari luar kelas. Lalu apa gunanya kelas ini?
Inilah Jawabannya: metode PABRIK .
Tambahkan metode di bawah ini di kelas di atas
Jadi sekarang Anda bisa membuat objek untuk kelas ini dari luarnya. Seperti jalan ...
Oleh karena itu, metode statis yang mengembalikan objek kelas dengan mengeksekusi konstruktor pribadinya disebut sebagai metode PABRIK
.
sumber
Static Factory Method
lebih dari konstruktor publik?Saya pikir saya akan menambahkan beberapa cahaya ke posting ini pada apa yang saya tahu. Kami menggunakan teknik ini secara ekstensif di kami
recent android project
. Alih-alihcreating objects using new operator
Anda juga dapat menggunakanstatic method
untuk membuat instance kelas. Daftar kode:Metode statis mendukung pembuatan objek bersyarat : Setiap kali Anda memanggil konstruktor, objek akan dibuat tetapi Anda mungkin tidak menginginkannya. misalkan Anda ingin memeriksa beberapa kondisi hanya kemudian Anda ingin membuat objek baru. Anda tidak akan membuat instance baru dari Vinoth setiap kali, kecuali jika kondisi Anda terpenuhi.
Contoh lain diambil dari Java Efektif .
Metode ini menerjemahkan nilai primitif boolean menjadi referensi objek Boolean. The
Boolean.valueOf(boolean)
Metode menggambarkan kita, tidak pernah menciptakan sebuah objek. Kemampuanstatic factory methods
untuk mengembalikan objek yang sama dari pengulanganinvocations
memungkinkan kelas untuk mempertahankan kontrol ketat atas instance yang ada kapan saja.Static factory methods
tidak seperti ituconstructors
, mereka dapat mengembalikan salahobject
satusubtype
dari tipe pengembalian mereka. Salah satu aplikasi fleksibilitas ini adalah API dapat mengembalikan objek tanpa membuat kelasnya publik. Menyembunyikan kelas implementasi dengan cara ini mengarah ke API yang sangat kompak.Calendar.getInstance () adalah contoh yang bagus untuk hal di atas, Ini membuat tergantung pada lokal a
BuddhistCalendar
,JapaneseImperialCalendar
atau secara defaultGeorgian
.Contoh lain yang bisa saya pikirkan adalah
Singleton pattern
, di mana Anda membuat konstruktor pribadi membuatgetInstance
metode sendiri di mana Anda memastikan, bahwa selalu ada hanya satu contoh yang tersedia.sumber
Metode pabrik, metode yang mengabstraksi instantiasi objek. Umumnya pabrik berguna ketika Anda tahu bahwa Anda memerlukan instance baru dari kelas yang mengimplementasikan beberapa antarmuka tetapi Anda tidak tahu kelas pelaksana.
Ini berguna ketika bekerja dengan hierarki kelas terkait, contoh yang baik dari ini adalah toolkit GUI. Anda dapat dengan mudah membuat kode panggilan ke konstruktor untuk implementasi konkret dari setiap widget, tetapi jika Anda ingin menukar satu toolkit dengan yang lain, Anda akan memiliki banyak tempat untuk diubah. Dengan menggunakan pabrik, Anda mengurangi jumlah kode yang perlu Anda ubah.
sumber
Salah satu keuntungan yang berasal dari pabrik Static adalah bahwa API dapat mengembalikan objek tanpa membuat kelas mereka publik. Ini mengarah ke API yang sangat ringkas. Di java ini dicapai oleh kelas Koleksi yang menyembunyikan sekitar 32 kelas yang membuatnya koleksi API sangat kompak.
sumber
Metode pabrik statis baik ketika Anda ingin memastikan bahwa hanya satu instance tunggal akan mengembalikan kelas beton untuk digunakan.
Misalnya, dalam kelas koneksi database, Anda mungkin ingin hanya satu kelas membuat koneksi database, sehingga jika Anda memutuskan untuk beralih dari Mysql ke Oracle Anda hanya dapat mengubah logika dalam satu kelas, dan sisa aplikasi akan gunakan koneksi baru.
Jika Anda ingin menerapkan penggabungan basis data, maka itu juga akan dilakukan tanpa mempengaruhi aplikasi lainnya.
Ini melindungi sisa aplikasi dari perubahan yang mungkin Anda lakukan pada pabrik, yang merupakan tujuannya.
Alasannya statis adalah jika Anda ingin melacak sumber daya terbatas (jumlah koneksi soket atau file menangani) maka kelas ini dapat melacak berapa banyak yang telah pingsan dan dikembalikan, sehingga Anda tidak menghabiskan sumber daya terbatas.
sumber
Salah satu keuntungan dari metode pabrik statis dengan konstruktor pribadi (pembuatan objek harus dibatasi untuk kelas eksternal untuk memastikan instance tidak dibuat secara eksternal) adalah Anda dapat membuat kelas yang dikendalikan oleh instance . Dan kelas yang dikendalikan oleh instance menjamin bahwa tidak ada dua instance berbeda yang sama ada ( a.equals (b) jika dan hanya jika a == b ) selama program Anda berjalan yang berarti Anda dapat memeriksa kesetaraan objek dengan operator == alih-alih metode yang sama , menurut java Efektif.
Dari Java Efektif, Joshua Bloch (Item 1, halaman 6)
sumber
Seorang anggota menyatakan dengan kata kunci 'statis'.
Metode yang membuat dan mengembalikan objek baru.
Bahasa pemrograman relevan dengan arti 'statis' tetapi tidak dengan definisi 'pabrik'.
sumber
Implementasi Java berisi kelas-kelas utilitas java.util.Arrays dan java.util.Collections keduanya mengandung metode pabrik statis , contohnya, dan cara menggunakan:
Arrays.asList("1","2","3")
Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...)
(Hanya beberapa contoh, dapat memeriksa javadocs untuk contoh metode mor https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html )Juga kelas java.lang.String memiliki metode pabrik statis seperti :
String.format(...), String.valueOf(..), String.copyValueOf(...)
sumber