Apa's "statis pabrik" metode?
The statis pabrik metode pola adalah cara untuk merangkum obyek ciptaan. Tanpa pabrik metode ini, anda hanya akan memanggil kelas's konstruktor langsung: Foo x = baru Foo()
. Dengan pola ini, anda malah akan memanggil metode pabrik: Foo x = Foo.create()
. Konstruktor ditandai swasta, sehingga mereka tidak dapat disebut kecuali dari dalam kelas, dan metode pabrik ditandai sebagai statis
sehingga dapat disebut tanpa terlebih dahulu memiliki sebuah objek.
Ada beberapa keuntungan untuk pola ini. Salah satunya adalah bahwa pabrik dapat memilih dari banyak subclass (atau pelaksana dari sebuah interface) dan kembali itu. Cara ini pemanggil dapat menentukan perilaku yang diinginkan melalui parameter, tanpa harus mengetahui atau memahami berpotensi kompleks kelas hirarki.
Keuntungan lain adalah, seperti yang dilakukan Matius dan James telah menunjukkan, mengontrol akses ke sumber daya yang terbatas seperti koneksi. Ini cara untuk menerapkan outdoor dapat digunakan kembali benda-benda - bukannya membangun, menggunakan, dan meruntuhkan sebuah objek, jika pembangunan dan kehancuran yang mahal proses-proses ini mungkin lebih masuk akal untuk membangun mereka sekali dan daur ulang mereka. Pabrik metode dapat kembali yang sudah ada, tidak terpakai instantiated objek jika memiliki salah satu, atau membuat satu jika jumlah objek di bawah ini adalah beberapa ambang batas yang lebih rendah, atau melempar pengecualian atau kembali null
jika's atas ambang atas.
Sesuai dengan artikel di Wikipedia, beberapa pabrik metode ini juga memungkinkan interpretasi yang berbeda dari yang sama tipe argumen. Biasanya constructor memiliki nama yang sama dengan nama kelas, yang berarti bahwa anda hanya dapat memiliki satu konstruktor dengan diberikan tanda tangan. Pabrik-pabrik yang tidak begitu dibatasi, yang berarti anda dapat memiliki dua metode yang berbeda yang menerima argumen yang sama jenis:
Coordinate c = Coordinate.createFromCartesian(double x, double y)
dan
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
Hal ini juga dapat digunakan untuk meningkatkan keterbacaan, sebagai Rasmus catatan.
CATATAN! " statis metode pabrik ini TIDAK sama Pabrik Metode pola" (c) Efektif Jawa, Joshua Bloch.
Pabrik Metode: "Mendefinisikan sebuah antarmuka untuk menciptakan sebuah objek, tetapi membiarkan kelas yang mengimplementasikan interface memutuskan mana kelas untuk instantiate. Pabrik metode yang memungkinkan sebuah class menunda instansiasi untuk subclass" (c) GoF.
"Statis pabrik metode ini hanya sebuah metode statis yang mengembalikan sebuah instance dari sebuah kelas." (c) Efektif Jawa, Joshua Bloch. Biasanya metode ini di dalam kelas tertentu.
Perbedaan:
Ide kunci dari statis pabrik adalah metode untuk mendapatkan kontrol atas objek penciptaan dan delegasi dari konstruktor untuk metode statis. Keputusan dari objek yang akan dibuat adalah seperti pada Abstrak Pabrik yang dibuat di luar metode (dalam kasus umum, tapi tidak selalu). Sementara tombol (!) ide dari Pabrik adalah Metode untuk mendelegasikan keputusan apa instance dari class untuk membuat dalam Metode Pabrik. E. g. klasik Singleton implementasi adalah kasus khusus dari statis metode pabrik. Contoh yang umum digunakan statis pabrik metode:
Kita menghindari yang menyediakan akses langsung ke database koneksi karena mereka're sumber daya intensif. Jadi kita menggunakan static pabrik metode getDbConnection
yang menciptakan koneksi jika kita'kembali di bawah batas. Jika tidak, mencoba untuk memberikan "suku cadang" koneksi, gagal dengan pengecualian jika ada tidak ada.
public class DbConnection{
private static final int MAX_CONNS = 100;
private static int totalConnections = 0;
private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();
private DbConnection(){
// ...
totalConnections++;
}
public static DbConnection getDbConnection(){
if(totalConnections < MAX_CONNS){
return new DbConnection();
}else if(availableConnections.size() > 0){
DbConnection dbc = availableConnections.iterator().next();
availableConnections.remove(dbc);
return dbc;
}else {
throw new NoDbConnections();
}
}
public static void returnDbConnection(DbConnection dbc){
availableConnections.add(dbc);
//...
}
}
Pembacaan dapat ditingkatkan dengan statis pabrik metode:
Bandingkan
public class Foo{
public Foo(boolean withBar){
//...
}
}
//...
// What exactly does this mean?
Foo foo = new Foo(true);
// You have to lookup the documentation to be sure.
// Even if you remember that the boolean has something to do with a Bar
// you might not remember whether it specified withBar or withoutBar.
untuk
public class Foo{
public static Foo createWithBar(){
//...
}
public static Foo createWithoutBar(){
//...
}
}
// ...
// This is much easier to read!
Foo foo = Foo.createWithBar();
- memiliki nama, seperti konstruktor, yang dapat memperjelas kode.
- tidak perlu untuk membuat objek baru pada setiap doa - benda dapat di-cache dan digunakan kembali, jika diperlukan.
- dapat kembali subtipe mereka kembali jenis - khususnya, dapat kembali sebuah objek dan implementasi class yang tidak diketahui ke pemanggil. Ini adalah hal yang sangat berharga dan banyak digunakan fitur dalam banyak kerangka yang menggunakan interface sebagai kembali statis jenis pabrik metode.
Itu semua bermuara untuk rawatan. Cara terbaik untuk menempatkan ini adalah setiap kali anda menggunakan baru
kata kunci untuk membuat sebuah objek, anda're kopling kode yang anda're menulis untuk implementasi.
Pabrik pola memungkinkan anda memisahkan bagaimana anda membuat sebuah objek dari apa yang anda lakukan dengan objek. Ketika anda membuat semua benda-benda yang menggunakan konstruktor, anda pada dasarnya kabel keras-kode yang menggunakan objek untuk penerapan tersebut. Kode yang menggunakan objek anda adalah "tergantung pada" objek tersebut. Ini mungkin tidak tampak seperti masalah besar di permukaan, tetapi ketika objek perubahan (berpikir untuk mengubah tanda tangan dari konstruktor, atau subclassing objek) anda harus kembali dan mengubah hal-hal di mana-mana.
Saat ini pabrik-pabrik yang sebagian besar telah menepis mendukung menggunakan Injeksi Ketergantungan karena mereka memerlukan banyak boiler-plat kode yang ternyata menjadi sedikit sulit untuk mempertahankan dirinya. Dependency Injection pada dasarnya adalah setara dengan pabrik-pabrik, tetapi memungkinkan anda untuk menentukan bagaimana anda mendapatkan benda-benda kabel bersama-sama declaratively (melalui konfigurasi atau penjelasan).
Jika konstruktor kelas adalah pribadi, maka anda tidak dapat membuat sebuah objek untuk class dari luar itu.
class Test{
int x, y;
private Test(){
.......
.......
}
}
Kita tidak bisa membuat objek untuk kelas atas dari luar itu. Sehingga anda tidak dapat mengakses x, y dari luar kelas. Lalu apa yang menggunakan dari kelas ini?
Berikut adalah Jawabannya : PABRIK metode.
Tambahkan kode di bawah ini metode di atas kelas
public static Test getObject(){
return new Test();
}
Jadi sekarang anda dapat membuat sebuah objek untuk kelas ini dari luar itu. Seperti cara...
Test t = Test.getObject();
Oleh karena itu, metode statis yang mengembalikan objek dari kelas dengan melaksanakan pribadi konstruktor disebut sebagai PABRIK metode
.
Saya pikir saya akan menambahkan beberapa cahaya ke posting ini tentang apa yang saya tahu. Kami menggunakan teknik ini secara luas di kami baru-baru ini proyek android
. Bukan membuat objek menggunakan operator baru
anda juga dapat menggunakan metode statis
untuk instantiate kelas. Kode listing:
//instantiating a class using constructor
Vinoth vin = new Vinoth();
//instantiating the class using static method
Class Vinoth{
private Vinoth(){
}
// factory method to instantiate the class
public static Vinoth getInstance(){
if(someCondition)
return new Vinoth();
}
}
Metode statis dukungan bersyarat objek penciptaan: Setiap kali anda memanggil konstruktor objek yang akan dibuat, tetapi anda mungkin tidak ingin bahwa. misalkan anda ingin memeriksa beberapa kondisi hanya kemudian anda ingin membuat objek baru.Anda tidak akan dapat membuat sebuah instance baru dari Vinoth setiap waktu, kecuali kondisi anda puas.
Contoh lain yang diambil dari Efektif Jawa.
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Metode ini diterjemahkan boolean primitif yang menjadi nilai Boolean referensi objek. The Boolean.valueOf(boolean)
metode menggambarkan kita, itu tidak pernah menciptakan sebuah objek. Kemampuan statis pabrik metode
untuk kembali objek yang sama dari diulang doa
memungkinkan kelas untuk mempertahankan kontrol yang ketat atas apa contoh yang ada pada setiap waktu.
Statis pabrik metode
adalah bahwa, tidak seperti konstruktor, mereka dapat kembali sebuah
objekapapun
subtipe` mereka kembali jenis. Salah satu aplikasi dari fleksibilitas ini adalah bahwa API dapat kembali benda-benda tanpa membuat mereka kelas umum. Menyembunyikan implementasi kelas-kelas dalam mode ini menyebabkan sangat kompak API.
Kalender.getInstance() adalah contoh yang bagus untuk di atas, Itu menciptakan tergantung pada lokasi a BuddhistCalendar
, JapaneseImperialCalendar
atau dengan default georgia
.
Contoh lain yang bisa saya pikirkan adalah Singleton pattern
, di mana anda membuat konstruktor pribadi buat sendiri acak
metode di mana anda pastikan, bahwa selalu ada hanya satu contoh yang tersedia.
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
Pabrik metode metode yang abstrak saat instansiasi objek. Umumnya pabrik-pabrik yang berguna ketika anda tahu bahwa anda membutuhkan sebuah instance baru dari class yang mengimplementasikan beberapa antarmuka tapi anda don't tahu pelaksana kelas.
Hal ini berguna ketika bekerja dengan hierarki terkait kelas, contoh yang baik dari ini akan menjadi sebuah GUI toolkit. Anda hanya bisa keras-kode panggilan untuk konstruktor untuk implementasi konkret dari masing-masing widget tapi jika anda pernah ingin menukar satu toolkit untuk yang lain anda'd memiliki banyak tempat untuk berubah. Dengan menggunakan pabrik anda mengurangi jumlah kode yang anda akan perlu untuk mengubah.
Salah satu keuntungan yang berasal dari Statis pabrik adalah bahwa API dapat kembali benda-benda tanpa membuat mereka kelas umum. Hal ini menyebabkan sangat kompak API. Di jawa hal ini dicapai dengan Koleksi kelas yang menyembunyikan sekitar 32 kelas yang membuatnya koleksi API yang sangat kompak.
Statis pabrik metode ini baik ketika anda ingin untuk memastikan bahwa hanya satu contoh akan kembali kelas beton yang akan digunakan.
Misalnya, di sebuah koneksi database kelas, anda mungkin ingin hanya memiliki satu kelas membuat koneksi database, sehingga jika anda memutuskan untuk beralih dari Mysql ke Oracle, anda hanya dapat mengubah logika dalam satu kelas, dan sisanya dari aplikasi akan menggunakan sambungan baru.
Jika anda ingin menerapkan database pooling, maka itu juga akan dilakukan tanpa mempengaruhi sisa aplikasi.
Ini melindungi seluruh aplikasi dari perubahan yang anda dapat membuat untuk pabrik, yang merupakan tujuan.
Alasan untuk itu harus statis adalah jika anda ingin melacak beberapa sumber daya yang terbatas (jumlah koneksi socket atau menangani file) maka kelas ini dapat melacak berapa banyak yang telah berlalu keluar dan kembali, sehingga anda don't buang sumber daya yang terbatas.
statis
Anggota dideklarasikan dengan kata kunci 'statis'.
pabrik metode
Metode yang membuat dan mengembalikan benda-benda baru.
di Jawa
Bahasa pemrograman yang relevan dengan makna 'statis' tapi tidak untuk definisi 'pabrik'.
Jawa implementasi berisi utilitas kelas java.util.Array dan java.util.Koleksi keduanya mengandung statis pabrik metode, contoh dan cara penggunaan :
Array.sebagai daftar("1","2","3")
Koleksi.synchronizedList(..), Koleksi.emptyList(), Koleksi.unmodifiableList(...)
(Hanya beberapa contoh, bisa cek javadocs untuk mor metode contoh https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html)
Juga java.lang.String class seperti statis pabrik metode:
String.format(...), String.valueOf(..), String.copyValueOf(...)
Salah satu keuntungan dari static pabrik dengan metode private konstruktor(pembuatan obyek harus telah dibatasi untuk eksternal kelas untuk memastikan kasus tersebut tidak dibuat secara eksternal) adalah bahwa anda dapat membuat contoh dikendalikan kelas. Dan contoh yang dikendalikan kelas menjamin bahwa tidak ada dua yang sama berbeda contoh yang ada(a.sama dengan(b) jika dan hanya jika a==b) selama program ini berjalan, yang berarti anda dapat memeriksa kesetaraan benda dengan == operator bukan sama metode, menurut Efektif jawa.
kemampuan statis pabrik metode untuk mengembalikan objek yang sama dari berulang-ulang doa yang memungkinkan kelas untuk mempertahankan kontrol yang ketat atas apa contoh yang ada pada setiap waktu. Kelas yang melakukan hal ini dikatakan contoh dikendalikan. Ada beberapa alasan untuk menulis contoh dikendalikan kelas. Contoh kontrol memungkinkan kelas untuk jaminan bahwa itu adalah singleton (Item 3) atau noninstantiable (Item 4). Juga, memungkinkan berubah kelas (Item 15) untuk membuat jaminan bahwa tidak ada dua yang sama contoh yang ada: a.sama dengan(b) jika dan hanya jika a==b. Jika kelas membuat jaminan ini, maka klien dapat menggunakan == operator bukan equals(Object) metode, yang dapat mengakibatkan peningkatan kinerja. Tipe Enum (30 Item) memberikan jaminan ini.
Dari Efektif Jawa, Joshua Bloch(Item 1,halaman 6)