Model Singleton adalah model desain paling sederhana di antara 23 model desain, dan juga banyak digunakan dalam pengembangan perusahaan. Keuntungan dari pola singleton adalah hanya ada satu contoh dalam proyek.
Fitur: Konstruktor diprivatisasi, objek diprivatisasi, dan hanya menyediakan antarmuka akses eksternal.
Skenario aplikasi:
1. Sistem perlu berbagi sumber daya: seperti sistem log, manajer sumber daya musim semi, dll.
2. Untuk mengontrol penggunaan sumber daya: seperti kumpulan utas
Aplikasi umum dalam pengembangan tingkat perusahaan dan kerangka kerja umum:
Servlets di J2EE, manajer sumber daya di musim semi (mis. Kacang), kumpulan koneksi basis data, kumpulan utas, sistem log, penghitung situs web, dll.
Klasifikasi Pola Singleton:
1. Mode Hungry: Mode Hungry adalah mode singleton paling sederhana untuk kode, tetapi instance dimuat saat kelas diinisialisasi. Jika tidak digunakan secara instan, sistem akan dimuat. Kode spesifiknya adalah sebagai berikut:
kelas publik singleton {private static singleton instance = new singleton (); private singleton () {} public static singleton getInstance () {return instance; }}2. Mode Lazy: Dibandingkan dengan mode lapar, mode malas dipakai dan ditempatkan di satu -satunya antarmuka eksternal untuk diproses, yang mewujudkan pemuatan yang tertunda, menghemat waktu inisialisasi sistem, tetapi ada situasi di mana utas tidak aman.
kelas publik singleton {private static singleton instance = null; private singleton () {} public static singleton getInstance () {if (instance == null) {return new new singleton (); } return instance; }}3. Kunci Periksa Double: Mode Kunci Periksa Double sebenarnya adalah peningkatan mode malas, membuat mode malas-aman-aman. Catatan: Ada masalah memori dengan kunci periksa ganda, yang dapat membatalkan kunci cek ganda.
kelas publik singleton {private static singleton instance = null; private singleton () {} public static singleton getInstance () {if (instance == null) {disinkronkan (singleton.class) {if (instance == null) {return singleton baru (); }} return instance; }}4. Mode Kelas Internal Statis: Kelas internal statis memiliki mode malas dan jahat: pemuatan yang aman dan tertunda.
kelas publik singleton {private static class singletonfactory {private static singleton instance = new singleton (); } private singleton () {} public static singleton getInstance () {return singletonfactory.instance; }}5. Mode Kelas Pencacahan: Ini harus menjadi mode kepentingan tunggal yang paling sempurna, yang tidak hanya aman-utas, tetapi juga mencegah masalah desequence dan refleksi.
enum singleton {instance; public void dosomething () {...}}Singleton Pattern Rincian Masalah:
1. Refleksi merusak mode singleton: Refleksi dapat menghancurkan implementasi mode singleton (kecuali untuk mode enumerasi)
/***Hancurkan mode singleton dengan refleksi*/kelas publik demo01 {public static void main (string [] args) melempar pengecualian {singleton s1 = singleton.getInstance (); Singleton s2 = singleton.getInstance (); System.out.println (S1 == S2); Kelas <singleton> clazz = (class <singleton>) class.forname ("com.singleton.singleton"); Konstruktor <singleton> constructor = clazz.getDeclaredConstructor (null); constructor.setAccessible (true); Singleton s3 = constructor.newinstance (); System.out.println (S1 == S3); }} kelas singleton {private static singleton instance = new singleton (); singleton pribadi () {// Metode untuk mencegah refleksi menghancurkan mode kepentingan tunggal, buka bagian komentar // if (instance! = null) {// lempar runimeException baru (); //}} public static singleton getInstance () {return instance; }}Faktanya, apa yang disebut pencegahan berarti membuatnya tidak mungkin untuk membuat melalui refleksi.
2. Deserialization merusak pola singleton (kecuali untuk pola kelas enumerasi)
/*** Deserialization melanggar pola singleton*/kelas publik demo02 {public static void main (string [] args) melempar pengecualian {singleton s1 = singleton.getInstance (); Singleton s2 = singleton.getInstance (); System.out.println (S1 == S2); FileOutputStream fos = new fileoutputStream ("d: //test.txt"); ObjectOutputStream oos = ObjectOutputStream baru (FOS); OOS.WriteObject (S1); oos.close (); fos.close (); ObjectInputStream OIS = ObjectInputStream baru (FileInputStream baru ("d: //test.txt")); Singleton s3 = (singleton) ois.readObject (); System.out.println (S1 == S3); }} kelas singleton mengimplementasikan serializable {private static singleton instance = new singleton (); public static singleton getInstance () {return instance; } // Deserialisasi default, jika objek sudah ada, metode ini akan disebut // objek pribadi readResolve () melempar ObjectStreamException {// Return Instance; // //}}Kedua situasi ini terbatas pada pemahaman dan tidak banyak digunakan dalam proses pengembangan yang sebenarnya.
Pada titik ini, pola singleton selesai.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.