Pola Singleton
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 65 dari 87.
Singleton Pattern adalah pola desain kreasi yang memastikan sebuah class hanya memiliki satu instance di seluruh aplikasimu, sekaligus menyediakan titik akses global ke instance tersebut. Pola ini berguna untuk sumber daya yang sebaiknya digunakan bersama, seperti pengelola konfigurasi, kumpulan koneksi, atau layanan pencatatan log.
Pola ini bekerja dengan menjadikan constructor bersifat private, sehingga mencegah pembuatan instance secara langsung. Sebagai gantinya, sebuah method statis mengatur akses ke satu-satunya instance:
public class DatabaseConnection {
private static DatabaseConnection instance;
// Konstruktor privat mencegah pembuatan instance secara langsung
private DatabaseConnection() {
System.out.println("Connection created");
}
// Titik akses global
public static DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
public void query(String sql) {
System.out.println("Executing: " + sql);
}
}Setiap pemanggilan getInstance() mengembalikan object yang sama. Instansinya dibuat hanya saat pertama kali diminta. Ini disebut inisialisasi malas:
DatabaseConnection db1 = DatabaseConnection.getInstance();
DatabaseConnection db2 = DatabaseConnection.getInstance();
System.out.println(db1 == db2); // true, instance yang samaKomponen utama Singleton adalah: field private static yang menyimpan instance, constructor private, dan method public static yang mengembalikan instance tersebut. Kombinasi ini menjamin bahwa sebanyak apa pun kamu meminta object tersebut, kamu akan selalu mendapatkan object yang sama.
Tantangan
MudahMari kita buat pengelola konfigurasi untuk sebuah aplikasi menggunakan Singleton Pattern! Pengelola konfigurasi ini akan memastikan semua bagian aplikasi berbagi pengaturan yang sama, berapa pun kali kamu meminta akses ke pengelola tersebut.
Kamu akan mengatur kodemu dalam dua file:
AppConfig.java: Buat class Singleton yang mengelola pengaturan konfigurasi aplikasi.AppConfigharus memiliki:Field static privat untuk menyimpan satu-satunya instance.
Field String privat bernama
appNamedan field int privat bernamamaxUsers.Konstruktor privat yang menginisialisasi
appNamedengan"MyApplication"danmaxUsersdengan100, lalu mencetakAppConfig initialized.Method
getInstance()static publik yang membuat instance hanya jika instance tersebut belum ada (inisialisasi malas), lalu mengembalikannya.Method
setAppName(String name)yang memperbarui nama aplikasi.Method
setMaxUsers(int max)yang memperbarui jumlah maksimum pengguna.Method
displaySettings()yang mencetakApp: [appName], Max Users: [maxUsers].Main.java: Tunjukkan bahwa Singleton-mu berfungsi dengan benar! Kamu akan menerima dua input: nama aplikasi baru (String) dan nilai maksimum pengguna baru (bilangan bulat).Pertama, dapatkan instance
AppConfigdan simpan dalam variabel bernamaconfig1. PanggildisplaySettings()untuk menampilkan nilai default.Lalu, perbarui pengaturan menggunakan nilai input dengan memanggil
setAppNamedansetMaxUserspadaconfig1.Dapatkan instance lain dan simpan dalam
config2. PanggildisplaySettings()padaconfig2untuk membuktikan bahwa instance tersebut mencerminkan perubahan yang dibuat melaluiconfig1.Terakhir, cetak apakah kedua referensi menunjuk ke object yang sama:
Same instance: [true/false]dengan membandingkanconfig1 == config2.
Kamu akan menerima dua input secara berurutan: nama aplikasi baru (String) dan jumlah maksimum pengguna baru (bilangan bulat).
Tantangan ini menunjukkan manfaat utama Singleton Pattern: berapa pun kali kamu meminta konfigurasi, kamu selalu mendapatkan instance yang sama dengan state bersama yang sama!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String newAppName = scanner.nextLine();
int newMaxUsers = scanner.nextInt();
// TODO: Ambil instance pertama dari AppConfig dan simpan di config1
// TODO: Panggil displaySettings() pada config1 untuk menampilkan nilai bawaan
// TODO: Perbarui pengaturan menggunakan setAppName dan setMaxUsers pada config1
// TODO: Ambil instance lain dan simpan di config2
// TODO: Panggil displaySettings() pada config2 untuk membuktikan bahwa perubahan berlaku bersama
// TODO: Cetak apakah kedua referensi menunjuk ke object yang sama:
// "Same instance: [true/false]" menggunakan config1 == config2
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online