Dart

Membuat Singleton di Dart

Singleton adalah design pattern yang memastikan sebuah kelas hanya memiliki satu instance sekaligus menyediakan akses global ke instance tersebut.

Singleton adalah design pattern yang memastikan sebuah kelas hanya memiliki satu instance sekaligus menyediakan titik akses global ke instance tersebut. Tujuan utamanya adalah mengontrol pembuatan objek dengan membatasi jumlah instance yang dapat diproduksi oleh sebuah kelas menjadi hanya satu.

Keunggulan

  • Akses Global: Menyediakan akses yang konsisten dan mudah ke satu instance di seluruh aplikasi.
  • Berbagi Resource: Ideal untuk mengelola resource bersama seperti koneksi database atau file konfigurasi.
  • Kesederhanaan dan Efisiensi: Dengan hanya satu instance, penggunaan memori dioptimalkan sehingga aplikasi menjadi lebih efisien.

Kekurangan

  • Tantangan dalam Unit Testing: State global yang dipertahankan oleh singleton dapat mempersulit pengujian terisolasi.
  • Dependensi Tersembunyi: Ketergantungan pada singleton mungkin tidak langsung terlihat, membuat codebase lebih sulit dikelola dan di-debug.
  • Error yang Sulit Dilacak: Kesalahan dalam singleton dapat merambat ke seluruh aplikasi, sehingga sulit menemukan akar penyebabnya.

Kasus Penggunaan

  • File Konfigurasi: Memuat dan menyimpan pengaturan yang dibutuhkan di seluruh aplikasi.
  • Caching: Mengelola cache terpusat untuk data yang sering diakses.
  • Koneksi Database: Mempertahankan satu koneksi database untuk menghindari overhead dari pembuatan koneksi baru secara berulang.
  • Inisialisasi SDK: Saat mengintegrasikan library atau API pihak ketiga, penting untuk menginisialisasi SDK hanya sekali. Menggunakan singleton untuk inisialisasi SDK memastikan SDK diatur hanya sekali, menghindari konflik, duplikasi resource, atau inkonsistensi state. Pendekatan ini juga membuat SDK dapat diakses secara global sehingga semua bagian aplikasi menggunakan konfigurasi dan state yang sama.

Kode

Berikut adalah contoh cara mengimplementasikan singleton di Dart:

class SDKManager {
  // Constructor bernama privat mencegah instansiasi dari luar.
  SDKManager._sharedInstance();

  // Satu instance statis dari SDKManager.
  static final SDKManager _instance = SDKManager._sharedInstance();

  // Getter publik untuk instance.
  static SDKManager get instance => _instance;

  // Factory constructor mengembalikan instance yang sama setiap kali.
  factory SDKManager() {
    return _instance;
  }

  bool _initialized = false;

  // Metode untuk menginisialisasi SDK.
  void initialize() {
    if (!_initialized) {
      print("Menginisialisasi SDK...");
      // Masukkan kode konfigurasi berat dan alokasi resource di sini.
      _initialized = true;
    } else {
      print("SDK sudah diinisialisasi.");
    }
  }
}

void main() {
  // sdk1 dan sdk2 keduanya merujuk pada instance yang sama.
  final sdk1 = SDKManager();
  final sdk2 = SDKManager.instance;

  sdk1.initialize(); // Output: Menginisialisasi SDK...
  sdk2.initialize(); // Output: SDK sudah diinisialisasi.
}

Kesimpulan

Design pattern singleton menawarkan kemudahan akses global dan berbagi resource di seluruh aplikasi. Namun, penggunaannya harus dilakukan dengan hati-hati. Kekurangannya — seperti mempersulit pengujian unit yang terisolasi, menciptakan dependensi tersembunyi, dan berpotensi menyebabkan masalah yang meluas ketika terjadi error — membuatnya tidak cocok untuk setiap situasi. Alternatif seperti Dependency Injection mungkin lebih disarankan dalam skenario di mana masalah-masalah tersebut dapat menimbulkan tantangan signifikan.

Referensi