Berbagi teknologi

Implementasi pola tunggal

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Perkenalan

1.1 Latar Belakang

Ketika aplikasi perlu mengontrol pembagian sumber daya, melakukan manajemen konfigurasi, dan operasi pencatatan log, persyaratan umum adalah menggunakan jalur akses global sehingga program dapat mengaksesnya melalui jalur akses global ini di mana pun jalur akses tersebut berada informasi contoh yang relevan. Untuk memenuhi kebutuhan tersebut, kita dapat menggunakan Pola Singleton. Pola singleton memastikan bahwa suatu kelas hanya memiliki satu instance dan menyediakan titik akses global untuk mengakses instance tersebut.

Secara khusus, pola tunggal biasanya menyediakan metode statis (seperti getInstance()) yang mengembalikan satu-satunya instance kelas. Karena metode ini bersifat statis, metode ini dapat dipanggil tanpa membuat turunan kelas. Ini berarti bahwa kode apa pun yang memiliki akses ke kelas bisa mendapatkan instance tunggal dengan memanggil metode statis ini.

1.2 Tujuan

Artikel ini akan memperkenalkan secara detail konsep dasar dan langkah implementasi pola tunggal. Melalui artikel ini, Anda akan dapat memahami cara kerja pola tunggal dan mempelajari cara menggunakannya secara efektif dalam proyek nyata.

2. Apa yang dimaksud dengan pola tunggal?

Sebagai contoh yang menarik, model singleton seperti lingkaran cahaya protagonis di dunia anime. Tidak peduli bagaimana plot berkembang, selalu hanya ada satu protagonis, dan semua orang tahu bahwa dialah inti cerita. Dengan cara ini, tidak peduli bagaimana ceritanya terungkap, semua orang dapat menemukan orang yang sama untuk memajukan alur cerita.

2.1 Kelebihan dan Kekurangan Pola Singleton

keuntungan

Pastikan satu contoh: Hindari pembuatan duplikat instance dan hemat sumber daya.
titik akses global: Akses global yang nyaman dan panggilan yang disederhanakan.
Inisialisasi malas: Membuat instance sesuai permintaan untuk meningkatkan kinerja.

kekurangan

Sulit untuk diukur: Kelas singleton seringkali sulit untuk diperluas karena konstruktornya bersifat pribadi.
potensi masalah kinerja: Dalam lingkungan konkurensi tinggi, beberapa implementasi mungkin mengalami masalah kinerja.
Kesulitan dalam pengujian: Pola tunggal dapat membuat pengujian menjadi sulit karena merupakan keadaan global.

2.2 Skenario penggunaan mode tunggal

Menurut karakteristik pola tunggal, skenario penggunaannya dapat dibagi menjadi beberapa kategori berikut:

  • Misalnya, dalam kasus berbagi sumber daya, data file konfigurasi dan file log dapat ditempatkan dalam sebuah file. Data konfigurasi atau file log ini dibaca secara seragam oleh objek tunggal, dan kemudian objek lain dalam proses layanan meneruskan singleton ini. Objek memperoleh informasi konfigurasi ini, yang dapat menyederhanakan manajemen konfigurasi di lingkungan yang kompleks.
  • Dalam hal pengendalian sumber daya, seperti kumpulan thread, desain kumpulan thread multi-utas umumnya mengadopsi mode tunggal untuk memfasilitasi kontrol thread di kumpulan.

3. Mode implementasi mode tunggal

Implementasi pola tunggal biasanya mencakup tiga elemen:

  1. konstruktor swasta, jadikan konstruktor kelas menjadi pribadi sehingga pihak luar tidak dapat membuat instance melalui kata kunci new.
  2. Referensi statis pribadi menunjuk ke instance sendiri, buat variabel instance statis di dalam kelas untuk menyimpan instance unik.
  3. Metode statis publik yang mengembalikan instance mereka sendiri, berikan metode statis sehingga dunia luar dapat memperoleh satu-satunya instance melalui metode ini.

3.1 Pola Singleton Cina yang Lapar

Untuk mode singleton gaya Lapar, instance singleton dibuat saat kelas dimuat, yang aman untuk thread karena objek statis telah dibuat saat kelas dimuat, dan kecepatan responsnya cepat saat dipanggil. Kerugiannya juga jelas. Efisiensi sumber daya tidak tinggi selama metode statis lain dari kelas tersebut dijalankan atau kelas tersebut dimuat, instance ini akan tetap diinisialisasi.

/**    
 * 饿汉单例模式:在还没有实例化的时候就初始化
 */
public class Hungry {    
  	//1. 开始时就创建实例
	private static final Hungry instance=new Hungry();
	
	// 2. 私有化的构造方法
	private void hungry() {  
	}
	
	public static Hungry getInstance() { 
		// 返回单例名
		return instance;  		
	}
}