โ 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