Definisi Pola Pabrik: Menyediakan antarmuka untuk membuat objek.
Mengapa Menggunakan Mode Pabrik
Model pabrik adalah model yang paling umum digunakan yang kami gunakan.
Mengapa model pabrik begitu umum digunakan? Karena pola pabrik setara dengan membuat objek instan baru, kita sering harus menghasilkan objek instan berdasarkan kelas kelas. Perlu lebih berhati -hati.
Mari kita ambil kelas sampel sebagai contoh.
Salinan kode adalah sebagai berikut:
Sampel sampel = sampel baru ();
Namun, kenyataannya adalah bahwa kami biasanya melakukan beberapa pekerjaan inisialisasi saat membuat contoh contoh, seperti database kueri penugasan, dll.
Pertama -tama, apa yang kita pikirkan adalah bahwa kita dapat menggunakan konstruktor sampel, sehingga instance dihasilkan dan ditulis sebagai:
Salinan kode adalah sebagai berikut:
Sampel sampel = sampel baru (parameter);
Namun, jika pekerjaan inisialisasi yang dilakukan saat membuat contoh contoh tidak sesederhana penugasan, itu mungkin merupakan kode panjang.
Mengapa Kode Jelek? Metode setara dengan menempatkan banyak telur di dalamnya. Kode panjang pengiriman ke setiap segmen, dan segmen "dienkapsulasi" lagi (mengurangi koneksi kopling antar segmen), sehingga risiko akan terdiversifikasi. Tidak ada lagi hal yang akan mempengaruhi setiap segmen.
Dalam contoh ini, pertama, kita perlu memisahkan pekerjaan membuat instance dari karya menggunakan instance, yaitu, memisahkan sejumlah besar pekerjaan inisialisasi yang diperlukan untuk membuat instance dari konstruktor sampel.
Pada saat ini, kita membutuhkan pola pabrik pabrik untuk menghasilkan objek, dan kita tidak dapat lagi menggunakan sampel baru yang sederhana (parameter). Juga, jika sampel memiliki warisan seperti sampel mySample, sesuai dengan pemrograman yang berorientasi antarmuka, kita perlu abstrak sampel ke dalam antarmuka. Sekarang sampel adalah antarmuka, dengan dua subclass mySample dan Hissample. Ketika kami ingin membuat mereka instantiasi, sebagai berikut:
Salinan kode adalah sebagai berikut:
Sampel mySample = mySample baru ();
Saat proyek semakin dalam, sampel dapat "membawa banyak putra", jadi kita perlu instantiate putra -putra ini satu per satu tidak dapat dihindari dalam program tradisional.
Tetapi jika Anda secara sadar menggunakan model pabrik sejak awal, masalah ini hilang.
Metode pabrik
Anda akan membangun pabrik yang berspesialisasi dalam memproduksi contoh contoh:
Salinan kode adalah sebagai berikut:
pabrik kelas publik {
Pembuat sampel statis publik (int yang) {
// getClass menghasilkan sampel secara umum, pemuatan kelas dinamis dapat digunakan untuk memuat kelas.
if (yang == 1)
mengembalikan samplea baru ();
lain jika (yang == 2)
mengembalikan sampel baru ();
}
}
Kemudian dalam program Anda, jika Anda ingin membuat sampel instantiate, gunakan kode kode salin sebagai berikut:
Sample sample = factory.creator (1);
Dengan cara ini, subkelas spesifik sampel tidak terlibat dalam seluruh proses. semakin mudah untuk membuat kesalahan. Setiap orang yang telah melakukan pekerjaan spesifik memiliki pemahaman yang mendalam tentang hal ini. Tampaknya kita juga dapat memahami prinsip -prinsip kehidupan dari pemrograman?
Gunakan metode pabrik untuk memperhatikan beberapa peran. Untuk menghasilkan sampel produk, seperti yang ditunjukkan pada gambar di bawah ini.
Agar lebih rumit, itu adalah untuk memperluas di kelas pabrik, yang juga mewarisi konkretefactory kelas implementasinya.
Pabrik Abstrak
Model pabrik meliputi: metode pabrik dan abstrak pabrik.
Perbedaan antara kedua pola ini adalah dalam kompleksitas penciptaan objek. Jika metode kami membuat objek menjadi rumit, seperti dalam metode pabrik di atas, itu adalah untuk membuat sampel objek, jika kami memiliki sampel antarmuka produk baru2.
Dengan asumsi di sini: Sampel memiliki dua kelas konkret samplea dan samleb, dan sampel2 juga memiliki dua kelas beton sampel2a dan sampelB2. Implementasi subkelas bagian yang berbeda, berikut ini adalah untuk memperluas pabrik dalam contoh di atas menjadi pabrik abstrak:
Salinan kode adalah sebagai berikut:
Pabrik Kelas Abstrak Publik {
pencipta sampel abstrak publik ();
PUBLIK PUBLIC ABSTRAK2 Pencipta (Nama String);
}
Kelas publik SimpleFactory Extends Factory {
Pembuat sampel publik () {......... Return New Samplea}
PUBLIK PUBLIK2 PRICTOR (NAMA STRING) {......... Kembalikan sampel baru2a}
}
Bombfactory kelas publik memperluas pabrik {
Pembuat sampel publik () {...... kembalikan sampel baru}
PUBLIK PUBLIK2 PRICTOR (NAMA STRING) {...... Return New Sample2b}
}
Dari yang di atas, kedua pabrik masing -masing menghasilkan satu set sampel dan sampel2. Mungkin Anda akan bertanya -tanya, mengapa saya tidak dapat menggunakan dua metode pabrik untuk menghasilkan sampel dan sampel2 masing -masing?
Ada titik kunci lain di pabrik abstrak, karena ada hubungan tertentu antara metode yang menghasilkan sampel dan sampel2 dalam bentuk yang sederhana, sehingga kedua metode ini perlu dibundel ke dalam satu kelas Proses disatukan, misalnya: Proses pembuatan relatif sederhana, jadi namanya SimpleFactory.
Dalam aplikasi praktis, metode pabrik lebih sering digunakan, dan dikombinasikan dengan loader kelas dinamis.
Contoh model pabrik java
Mari kita ambil ForumFactory Jive sebagai contoh.
Salinan kode adalah sebagai berikut:
Public Abstract Class ForumFactory {
Private Static Object InitLock = Objek Baru ();
Public Static ForumFactory getInstance (otorisasi otorisasi) {
// Jika tidak ada otorisasi yang valid, kembalikan null.
if (otorisasi == null) {return null;}
// Berikut ini menggunakan mode singleton singleton
if (factory == null) {
disinkronkan (initlock) {
if (factory == null) {......
mencoba {
// cetak ulang dinamis
Class c = class.forname (className);
factory = (forumfactory) c.newinstance ();
} catch (Exception e) {return null;}
}
}
}
// Sekarang, kembalikan proxy.
Return New ForumFactoryProxy (Otorisasi, Factory, Factory.getpermissions (Otorisasi));
}
// Metode pembuatan forum diselesaikan oleh forum forum yang mewarisi subclass.
Publik Abstrak Forum CreateForum (nama string, deskripsi string)
melempar Exhorized Exception, ForumalReadyExistSException;
...
}
Karena Jive sekarang menyimpan posting forum dan data konten lainnya melalui sistem basis data, jika Anda ingin mengubahnya untuk diimplementasikan melalui sistem file, metode Forum Metode Pabrik ini menyediakan antarmuka yang dinamis:
Salinan kode adalah sebagai berikut:
Private Static String className = "com.jivesoftware.forum.database.dbforumFactory";
Anda dapat menggunakan metode yang Anda kembangkan untuk membuat forum alih -alih com.jivesoftware.forum.database.dbforumFactory.
Dalam kode di atas, ada tiga mode. Forum Akses: Jika Anda adalah pengguna dan tamu terdaftar, maka izin yang sesuai akan berbeda, dan izin ini berjalan melalui seluruh sistem.
Lihat Catalogdaofactory di Java Pet Store:
Salinan kode adalah sebagai berikut:
Catalogdaofactory kelas publik {
/**
* Metode ini mengembangkan subkelas khusus untuk mengimplementasikan pola DAO.
* Definisi subclass spesifik adalah dalam deskriptor penyebaran J2EE.
*/
Public Static Catalogdao getdao () melempar CatalogdaosySexception {
Catalogdao catdao = null;
mencoba {
InitialContext ic = new InitialContext ();
// pemuatan dinamis dari CATALOG_DAO_CLASS
// Anda dapat mendefinisikan katalog_dao_class Anda sendiri, sehingga Anda tidak perlu mengubah terlalu banyak kode
//, selesaikan perubahan sistem yang sangat besar.
String className = (string) ic.lookup (jndinames.catalog_dao_class);
catdao = (Catalogdao) class.forname (className) .newInstance ();
} catch (NamingException ne) {
Lemparkan CatalogdaosySexception baru ("Catalogdaofactory.getdao: NamingException sambil mendapatkan DAO Type: /n" + ne.getMessage ());
} catch (pengecualian se) {
Lemparkan CatalogdaosySexception baru ("Catalogdaofactory.getdao: Pengecualian saat mendapatkan DAO TYPE: /N" + SE.getMessage ());
}
mengembalikan catdao;
}
}
Catalogdaofactory adalah metode pabrik yang khas. Menerapkan subkelas dan berikan nama subkelas Anda sendiri ke variabel CATALOG_DAO_CLASS.
Dapat dilihat bahwa metode pabrik memang memberikan mekanisme ekspansi dinamis yang sangat fleksibel dan kuat untuk struktur sistem. dimungkinkan untuk mengubah fungsi sistem dalam transformasi.