Latest web development tutorials

Pola Singleton

Singleton (Singleton Pattern) Java adalah salah satu pola desain sederhana. Jenis pola desain milik membuat skema, yang menyediakan cara terbaik untuk membuat objek.

Model ini melibatkan satu kelas yang bertanggung jawab untuk menciptakan objek sendiri, sambil memastikan bahwa hanya satu objek dibuat. Kelas ini menyediakan objek yang unik dari kunjungan mereka, dapat diakses secara langsung, Anda tidak perlu instantiate obyek dari kelas itu.

Catatan:

  • 1, kelas tunggal dapat memiliki hanya satu contoh.
  • 2, kelas tunggal harus membuat contoh yang unik mereka sendiri.
  • 3, kelas tunggal harus memberikan contoh ini untuk semua benda lainnya.

pengenalan

Maksud: untuk memastikan bahwa hanya satu contoh dari kelas, dan menyediakan jalur akses global untuk mengaksesnya.

Solusi utama: menggunakan kelas global yang sering diciptakan dan dihancurkan.

Kapan menggunakan: Bila Anda ingin mengontrol jumlah contoh ketika, untuk menghemat sumber daya sistem.

Bagaimana mengatasi: menentukan apakah sistem yang sudah memiliki satu kasus ini, jika kembali, jika tidak maka dibuat.

Kode kunci: constructor adalah swasta.

contoh aplikasi: 1, pesta hanya dapat memiliki satu presiden.2, Windows adalah multi-proses, multi-threaded, dalam operasi file ketika pasti beberapa proses atau thread secara bersamaan dokumen dari fenomena tersebut, pengolahan semua file harus dilakukan oleh individu unik. 3, beberapa manajer peralatan sering dirancang sebagai model-kasus tunggal, seperti komputer dengan dua printer dalam output bila diperlukan untuk menangani dua printer tidak dapat mencetak file yang sama.

Keuntungan: 1, hanya satu contoh di memori, mengurangi memori di atas kepala, terutama sering membuat dan menghancurkan contoh (seperti School of Management Home page Cache).2, untuk menghindari beberapa hunian sumber daya (seperti operasi file write).

Cons: tidak ada antarmuka, tidak mewarisi, dan tanggung jawab tunggal konflik prinsip, kelas hanya harus peduli tentang logika internal, tidak di luar seperti bagaimana untuk instantiate.

Penggunaan skenario: 1, memerlukan produksi nomor seri yang unik.2, counter WEB, tidak setiap database Riga sekali dengan kasus tunggal untuk menyegarkan cache. 3, obyek diciptakan oleh kebutuhan untuk konsumsi berlebihan sumber daya, seperti I / O koneksi ke database dan sebagainya.

Catatan: getInstance () metode memerlukan penggunaan sinkronisasi mengunci disinkronisasi (Singleton.class) untuk mencegah beberapa thread ke penyebab contoh yang dipakai beberapa kali.

realisasi

Kami akan membuat kelasSingleObject.kelasSingleObjectmemiliki konstruktor pribadi dan contoh statis.

kelasSingleObjectmenyediakan metode statis untuk mendapatkan luar misalnya statis.SingletonPatternDemo,kelas demonstrasi kami menggunakan kelasSingleObjectuntuk mendapatkan objekSingleObject.

pola tunggal diagram UML

Langkah 1

Buat kelas Singleton.

SingleObject.java

public class SingleObject {

   // Buat objek SingleObject pribadi misalnya SingleObject static = SingleObject baru ();

   // Membuat konstruktor pribadi, sehingga kelas tidak akan dipakai SingleObject swasta () {}

   // Dapatkan satu-satunya obyek publik yang tersedia statis SingleObject getInstance () {
      kembali contoh;
   }

   public void ShowMessage () {
      System.out.println ( "Hello World!");
   }
}

Langkah 2

Dapatkan objek yang unik dari kelas tunggal.

SingletonPatternDemo.java

public class SingletonPatternDemo {
   public static void main (String [] args) {

      // Konstruktor // ilegal kompilasi-time error: Constructor SingleObject () tidak terlihat // objek SingleObject = SingleObject baru ();

      // Dapatkan hanya objek objek yang tersedia SingleObject = SingleObject.getInstance ();

      // Pesan Tampilan object.showMessage ();
   }
}

Langkah 3

Verifikasi output.

Hello World!

Beberapa implementasi pola Singleton

Menerapkan pola tunggal sejumlah cara, sebagai berikut:

1, gaya malas, benang-aman

Adalah malas inisialisasi: Ya

Adalah multi-thread aman: Tidak ada

Mencapai Kesulitan: Mudah

Keterangan: Metode ini adalah cara yang paling dasar untuk mencapai implementasi ini masalah terbesar adalah tidak mendukung multi-threading.Karena tidak ada kunci disinkronkan, sehingga arti sempit itu tidak tunggal.
lazy loading dengan cara ini jelas tidak memerlukan benang pengaman, bekerja di multi-threaded tidak bekerja.

contoh kode:

public class Singleton {  
    private static Singleton misalnya;  
    pribadi Singleton () {}  
  
    public static Singleton getInstance () {  
    jika (misalnya == null) {  
        Misalnya = baru Singleton ();  
    }  
    kembali contoh;  
    }  
}  

Presentasi berikutnya beberapa implementasi mendukung beberapa benang, namun berbeda dalam kinerja.

2, gaya malas, benang-aman

Adalah malas inisialisasi: Ya

Adalah multi-thread aman: Ya

Mencapai Kesulitan: Mudah

Keterangan: dengan cara ini memiliki lazy loading yang baik, dapat bekerja dengan baik dalam multi-thread, bagaimanapun, adalah efisiensi yang sangat rendah, 99% kasus tidak memerlukan sinkronisasi.
Keuntungan: Panggilan pertama diinisialisasi, untuk menghindari memori terbuang.
Cons: Harus terkunci disinkronisasi untuk memastikan satu kasus, tapi kunci akan mempengaruhi efisiensi.
getInstance () kinerja aplikasi tidak penting (yang menggunakan lebih jarang).

contoh kode:

public class Singleton {  
    private static Singleton misalnya;  
    pribadi Singleton () {}  
    public static disinkronisasi Singleton getInstance () {  
    jika (misalnya == null) {  
        Misalnya = baru Singleton ();  
    }  
    kembali contoh;  
    }  
} 

3, kelaparan rumus

Apakah Malas Inisialisasi: Tidak ada

Adalah multi-thread aman: Ya

Mencapai Kesulitan: Mudah

Keterangan: Ini lebih umum, tetapi rentan terhadap benda-benda sampah.
Keuntungan: tidak terkunci, efisiensi ditingkatkan.
Kekurangan: class loader diinisialisasi, memori yang terbuang.
Hal ini didasarkan pada mekanisme classloder menghindari sinkronisasi multithreading, namun, misalnya ketika instantiated kelas loader, meskipun penyebab kelas memuat berbagai alasan, sebagian besar pola Singleton adalah untuk memanggil metode getInstance, tetapi tidak dapat ditentukan ada cara lain (atau metode statis lainnya) mengarah ke class loading, kali ini tampaknya tidak mencapai contoh inisialisasi lazy loading efek.

contoh kode:

public class Singleton {  
    private static Singleton misalnya = baru Singleton ();  
    pribadi Singleton () {}  
    public static Singleton getInstance () {  
    kembali contoh;  
    }  
}  

4, periksa kunci / lock pengecekan ganda (DCL, yaitu mengecek penguncian)

Versi JDK: JDK1.5 dari

Adalah malas inisialisasi: Ya

Adalah multi-thread aman: Ya

Menyadari kesulitan: lebih kompleks

Keterangan: Metode ini menggunakan mekanisme penguncian ganda, keamanan dan, dalam kasus multi-threading untuk mempertahankan kinerja tinggi.
getInstance () kinerja aplikasi sangat penting.

contoh kode:

public class Singleton {  
    pribadi yang mudah menguap statis Singleton tunggal;  
    pribadi Singleton () {}  
    public static Singleton getSingleton () {  
    jika (tunggal == null) {  
        disinkronisasi (Singleton.class) {  
        jika (tunggal == null) {  
            tunggal = baru Singleton ();  
        }  
        }  
    }  
    kembali tunggal;  
    }  
}  

5, pendaftaran tipe / kelas batin statis

Adalah malas inisialisasi: Ya

Adalah multi-thread aman: Ya

Menyadari kesulitan: Umum

Keterangan: Metode ini dapat mencapai modus kunci periksa efek yang sama, namun pelaksanaannya lebih mudah.Gunakan inisialisasi malas bidang statis harus digunakan dengan cara ini bukannya periksa modus kunci. Ini hanya berlaku untuk kasus bidang statis, periksa modus kunci dapat digunakan bila diperlukan delay untuk menginisialisasi bidang misalnya.
Pendekatan ini juga mengambil keuntungan dari mekanisme classloder untuk memastikan bahwa hanya satu thread contoh inisialisasi, itu adalah dengan 3 cara yang berbeda adalah: selama cara ketiga kelas Singleton dimuat, misalnya diberi contoh (tidak mencapai lazy loading efek), namun pendekatan ini adalah kelas Singleton dimuat, misalnya tidak dapat diinisialisasi. Karena kelas SingletonHolder tidak aktif digunakan, hanya ditampilkan melalui metode panggilan getInstance, muncul dimuat kelas SingletonHolder, yang dipakai misalnya. Bayangkan, jika Anda instance sumber daya-intensif, sehingga ingin menunda pemuatan, di sisi lain, ketika Anda tidak ingin instantiate kelas Singleton loader, karena tidak dapat memastikan kelas Singleton mungkin juga aktif di daerah lain sehingga menjadi dimuat, kali ini untuk instantiate contoh jelas tidak pantas. Kali ini, dengan cara ini dibandingkan dengan tiga jenis pertama cara itu sangat wajar.

contoh kode:

public class Singleton {  
    swasta kelas statis SingletonHolder {  
    private static akhir Singleton Instance = new Singleton ();  
    }  
    pribadi Singleton () {}  
    public static final Singleton getInstance () {  
    kembali SingletonHolder.INSTANCE;  
    }  
}   

6, menghitung

Versi JDK: JDK1.5 dari

Apakah Malas Inisialisasi: Tidak ada

Adalah multi-thread aman: Ya

Mencapai Kesulitan: Mudah

Keterangan: Implementasi ini belum diadopsi secara luas, tapi ini adalah cara terbaik untuk menerapkan pola tunggal.Hal ini lebih ringkas, mekanisme dukungan serialisasi otomatis untuk mencegah beberapa contoh mutlak.
Pendekatan ini penulis Efektif Jawa Josh Bloch pendukung dengan cara yang tidak hanya dapat menghindari masalah sinkronisasi multi-thread, tetapi juga secara otomatis mendukung mekanisme serialisasi untuk mencegah deserialization kembali membuat objek baru, benar-benar mencegah beberapa Instansiasi. Namun, karena hanya bergabung setelah properti enum JDK1.5, menulis dengan cara ini tidak bisa tidak merasa aneh, dalam prakteknya, jarang digunakan.
Bukan dengan serangan refleksi untuk memanggil konstruktor pribadi.

contoh kode:

enum publik Singleton {  
    Instance;  
    public void whateverMethod () {  
    }  
}  

Aturan praktis: Dalam keadaan normal, tidak merekomendasikan penggunaan jenis pertama dan jenis kedua cara malas, dianjurkan untuk menggunakan cara ketiga orang lapar.Hanya ketika Anda ingin menerapkan efek lazy loading jelas, kita akan menggunakan lima jenis pertama cara untuk mendaftar. Jika datang ke deserialize objek untuk membuat, Anda dapat mencoba menggunakan modus pencacahan keenam. Jika Anda memiliki kebutuhan khusus lainnya, Anda dapat mempertimbangkan menggunakan cek ganda keempat modus kunci.