โ† Kembali ke Design Pattern
๐Ÿ”’
Creational

Singleton

Memastikan sebuah class hanya punya satu instance dan menyediakan satu titik akses global ke instance tersebut.

Masalahnya

Beberapa resource, seperti koneksi database, konfigurasi, atau cache, seharusnya hanya ada satu. Tanpa Singleton, memanggil `new Manager()` di banyak tempat akan membuat instance terpisah yang bisa saling tidak sinkron.

Cara Kerja

  • โ€บHanya ada satu instance selama aplikasi berjalan
  • โ€บLazy initialization: instance baru dibuat saat pertama kali diakses
  • โ€บDi lingkungan concurrent perlu thread safety; gunakan dispatch queue atau blok synchronized
  • โ€บSulit di-unit-test karena membawa state global antar test
  • โ€บUtamakan dependency injection dibanding Singleton jika testability itu penting

Kapan Digunakan

โœ“Resource bersama seperti koneksi database, logger, atau analytics tracker
โœ“Configuration manager yang cukup membaca pengaturan satu kali
โœ“Cache in-memory yang dipakai bersama di seluruh aplikasi
โœ“Wrapper untuk antarmuka hardware (serial port, Bluetooth manager)

Contoh di Dunia Nyata

๐ŸŽ
iOS

URLSession.shared, UserDefaults.standard, NotificationCenter.default

๐Ÿค–
Android

Room database instance, Retrofit client, SharedPreferences

๐ŸŒ
Web

Database connection pool, logger instance, event bus

Contoh Kode

Swift
final class AppSettings {
    static let shared = AppSettings()
    private init() {}   // prevents external instantiation

    var theme: String = "light"
    var language: String = "en"
}

// Usage โ€” always the same instance
AppSettings.shared.theme = "dark"
print(AppSettings.shared.theme) // "dark"

// Real-world equivalents:
// URLSession.shared
// UserDefaults.standard
// NotificationCenter.default