Analisis pola desain instance singleton sederhana
Kata pengantar
Hari ini saya akan memberi Anda ringkasan komprehensif dari pola desain yang paling umum digunakan dalam pengembangan android - mode singleton.
Mengenai pengantar pola desain, Anda dapat membaca apa yang saya tulis sebelumnya: 1 menit untuk sepenuhnya memahami "pola desain"
Daftar isi
1. Perkenalkan
1.1 Masalah apa yang terpecahkan
Seperti yang disebutkan sebelumnya, pola desain = solusi untuk jenis masalah tertentu, jadi masalah apa yang menjadi pola singleton ?
Artinya: singleton = sebuah instance;
Masalah terpecahkan: Kurangi kopling antar objek
Solusi: Pola singleton, yaitu, menerapkan bahwa kelas hanya memiliki satu objek instantiated dan memberikan titik akses global
1.2 PENDAHULUAN Contoh
Selanjutnya saya menggunakan instance untuk memperkenalkan pola singleton
Latar belakang: Xiaocheng memiliki pabrik plastik, tetapi hanya ada satu gudang di dalamnya.
Tujuan: Saya ingin menggunakan kode untuk mengimplementasikan manajemen gudang
Praktik saat ini: Membangun gudang dan pekerja
Di antara mereka, jumlah di kelas gudang = jumlah barang; Pekerja memiliki metode penanganan MoveIn (int i) dan Moveout (int i).
Masalah: Melalui pengujian, ditemukan bahwa setiap kali seorang pekerja bergerak, gudang baru akan dibangun, yaitu barang -barang tidak ditempatkan di gudang yang sama. Apa yang terjadi? (Lihat kode di bawah)
Paket scut.designmodel.singletonpattern; // gudang kelas gudang gudang {private int kuantitas = 100; public void setquantity (int kuantitas) {this.quantity = kuantitas; } public int getquantity () {kuantitas pengembalian; }} // Walking Human Class Carrier {Public Storehouse Mstorehouse; operator publik (gudang gudang) {mstorehouse = gudang; } // memindahkan barang ke gudang public void movein (int i) {mstorehouse.setquantity (mstorehouse.getquantity ()+i); } // pindah dari gudang public void moveout (int i) {mstorehouse.setquantity (mstorehouse.getquantity ()-i); }} // Pekerja menangani tes kelas publik SinglePattern {public static void main (string [] args) {Storehouse mstorehouse1 = new Storehouse (); Storehouse mstorehouse2 = Storehouse baru (); Operator operator1 = pembawa baru (mstorehouse1); Operator operator2 = pembawa baru (mstorehouse2); System.out.println ("Apakah keduanya sama?"); if (mstoreHouse1.equals (mStorehouse2)) {// Gunakan sama di sini alih -alih simbol ==, karena simbol == hanya untuk membandingkan alamat dua objek System.out.println ("adalah sama"); } else {System.out.println ("tidak sama"); } // Setelah porter memindahkan barang, laporkan jumlah barang di gudang operator1.movein (30); System.out.println ("Margin Produk Gudang:"+Carrier1.mstorehouse.getQuantity ()); Carrier2.moveout (50); System.out.println ("Margin Produk Gudang:"+Carrier2.mstorehouse.getQuantity ()); }}hasil:
Apakah keduanya sama? Margin produk di gudang yang sama: 130 Margin Produk Gudang: 50
2. Pengantar Pola Singleton
2.1 masalah yang diselesaikan (skenario aplikasi)
Konflik: Dari hasil di atas, dapat dilihat bahwa pekerja yang beroperasi jelas bukan instance gudang yang sama.
Sasaran: Semua pekerja mengoperasikan instance gudang yang sama
Pola singleton adalah solusi untuk jenis masalah ini: Menerapkan kelas dengan hanya satu objek instantiated dan memberikan prinsip kerja titik akses 2.2 global
Di Java, kami mengoperasikan kelas -kelas ini dengan menggunakan objek (setelah instantiasi kelas). Instantiasi kelas dilakukan melalui konstruktornya . Jika kami ingin menerapkan bahwa suatu kelas hanya memiliki satu objek instantiated, kami harus mengerjakan konstruktor kelas:
Implementasi Umum Singleton Mode: (termasuk langkah penggunaan)
Singleton kelas publik {// 1. Buat variabel pribadi OurInstance (digunakan untuk merekam instance unik singleton) // 2. Instantiate internal singleton singleton ourinstance = singleton baru (); // 3. Privatisasi konstruktor kelas dan mencegah panggilan eksternal untuk membuat singleton pribadi () {} // 4. Tentukan metode publik untuk memberikan titik akses unik global untuk kelas // 5. Secara eksternal mengembalikan contoh unik dengan memanggil metode getInstance () public static singleton newInstance () {return ourInstance; }}Oke, Anda harus memahami pengantar dan prinsip -prinsip pola singleton, kan? Jadi mari kita selesaikan masalah bahwa "gudang tidak sama" yang muncul di atas Xiaocheng!
2.3 Contoh Pendahuluan
Xiaocheng menggunakan mode singleton untuk meningkatkan kode untuk contoh di atas:
Paket scut.designmodel.singletonpattern; import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; // gudang gudang singleton gudang {// jumlah produk gudang pribadi int kuantitas = 100; // STORHOUSH STATIC STATIC OURTANCE = NEW HOUSHOUSH () ;; // Biarkan metode eksternal panggilan getInstance () untuk mengembalikan instance unik. gudang statis publik getInstance () {return OurInstance; } // konstruktor tertutup private storeHouse () {} public void setquantity (int kuantitas) {this.quantity = kuantitas; } public int getquantity () {kuantitas pengembalian; }} // Carrier Man Class Carrier {Public Storehouse Mstorehouse; operator publik (gudang gudang) {mstorehouse = gudang; } // pindahkan barang ke gudang public void movein (int i) {mstorehouse.setquantity (mstorehouse.getquantity ()+i); } // pindah dari gudang public void moveout (int i) {mstorehouse.setquantity (mstorehouse.getquantity ()-i); }} // Pekerja menangani tes kelas publik SinglePattern {public static void main (string [] args) {Storehouse mstorehouse1 = Storehouse.getInstance (); Gudang mstorehouse2 = Storehouse.getInstance (); Operator operator1 = pembawa baru (mstorehouse1); Operator operator2 = pembawa baru (mstorehouse2); System.out.println ("Apakah keduanya sama?"); if (mStorehouse1.equals (mstorehouse2)) {System.out.println ("adalah sama"); } else {System.out.println ("tidak sama"); } // Setelah porter memindahkan barang, laporkan jumlah barang di gudang, carrier1.movein (30); System.out.println ("Margin Produk Gudang:"+Carrier1.mstorehouse.getQuantity ()); Carrier2.moveout (50); System.out.println ("Margin Produk Gudang:"+Carrier2.mstorehouse.getQuantity ()); }}hasil:
Apakah keduanya sama? Itu adalah margin komoditas gudang yang sama: 130 gudang komoditas margin: 80
Menurut analisis hasil, setelah menggunakan model Singleton, hanya ada satu instance gudang di kelas gudang, dan tidak perlu khawatir tentang porter yang memasuki gudang yang salah! Lai Lai
2.4 Keuntungan
2.5 Kekurangan
3. Implementasi Mode Singleton
3.1 Situasi Umum
Gaya lapar (metode implementasi singleton paling sederhana)
kelas singleton {private static singleton ourinstance = singleton baru (); private singleton () {} public static singleton newInstance () {return ourInstance; }}Skenario aplikasi:
Gaya malas
Perbedaan terbesar antara malas dan lapar adalah waktu operasi inisialisasi singleton :
kelas singleton {private static singleton ourinstance = null; private singleton () {} public static singleton newInstance () {if (ourinstance == null) {ourinstance = new singleton (); } return OurInstance; }}Skenario aplikasi:
3.2 Implementasi mode singleton di bawah multithreading
Dalam kasus multithreading:
Solusi 1: Kunci Sinkronisasi
Gunakan kunci sinkronisasi sinkronisasi (singleton.class) untuk mencegah beberapa utas masuk secara bersamaan, menyebabkan instance dipakai beberapa kali.
kelas singleton {private static singleton ourinstance = null; private singleton () {} public static singleton newInstance () {disinkronkan (singleton.class) {if (ourinstance == null) {ourinstance = singleton baru (); }} return OurInstance; }}Solusi 2: Kunci Periksa Ganda
Lapisan IF ditambahkan berdasarkan kunci sinkronisasi (kecuali disinkronkan (singleton.class)) adalah untuk meningkatkan kinerja setelah instance telah dipakai dan pada waktu berikutnya masuk, ia tidak harus mengeksekusi sinkronisasi (singleton.class) untuk mendapatkan kunci objek, sehingga meningkatkan kinerja.
kelas singleton {private static singleton ourinstance = null; private singleton () {} public static singleton newInstance () {if (ourinstance == null) {disinkronkan (singleton.class) {if (ourinstance == null) {ourinstance = singleton baru (); }}} return OurInstance; }}Solusi 3: Kelas Dalam Statis
Ketika kelas JVM memuat, data dijamin akan disinkronkan. Kami menggunakan implementasi kelas internal: Buat instance objek di kelas internal.
Selama aplikasi tidak menggunakan JVM kelas internal, kelas Singleton tidak akan dimuat, dan objek Singleton tidak akan dibuat, sehingga mencapai pemuatan malas dan malas dan keselamatan utas.
kelas singleton {// objek singleton akan dibuat hanya ketika kelas dalam dimuat kelas statis singleton2 {private static singleton ourinstance = singleton baru (); } private singleton () {} public static singleton newInstance () {return singleton2.ourinstance; }}Solusi 4: Menghitung Jenis
Metode implementasi singleton yang paling sederhana dan mudah digunakan (direkomendasikan oleh "Java yang efektif")
publik enum singleton {// tentukan elemen enum, yang merupakan instance dari singleton instance; public void dosomething () {}}Cara menggunakannya adalah sebagai berikut:
Singleton singleton = singleton.instance; singleton.dosomething ();
5. Ringkasan
Artikel ini terutama memperkenalkan model Singleton, termasuk prinsip -prinsip dan metode implementasi. Selanjutnya, saya akan terus menjelaskan model desain lainnya. Jika Anda tertarik, Anda dapat terus memperhatikannya.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!