Menu
CoddyTech

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 sama

Komponen 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.

challenge icon

Tantangan

Mudah

Mari 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. AppConfig harus memiliki:

    Field static privat untuk menyimpan satu-satunya instance.

    Field String privat bernama appName dan field int privat bernama maxUsers.

    Konstruktor privat yang menginisialisasi appName dengan "MyApplication" dan maxUsers dengan 100, lalu mencetak AppConfig 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 mencetak App: [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 AppConfig dan simpan dalam variabel bernama config1. Panggil displaySettings() untuk menampilkan nilai default.

    Lalu, perbarui pengaturan menggunakan nilai input dengan memanggil setAppName dan setMaxUsers pada config1.

    Dapatkan instance lain dan simpan dalam config2. Panggil displaySettings() pada config2 untuk membuktikan bahwa instance tersebut mencerminkan perubahan yang dibuat melalui config1.

    Terakhir, cetak apakah kedua referensi menunjuk ke object yang sama: Same instance: [true/false] dengan membandingkan config1 == 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
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online