Menu
CoddyTech

Pola Singleton

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 90 dari 110.

Pola Singleton memastikan bahwa sebuah class hanya memiliki satu instance di seluruh aplikasi kamu, dan menyediakan titik akses global untuk instance tersebut. Ini berguna saat hanya diperlukan satu object untuk mengoordinasikan tindakan di seluruh sistem, seperti pengelola konfigurasi, koneksi database, atau layanan pencatatan log.

Di Dart, kamu dapat mengimplementasikan Singleton dengan menggunakan konstruktor factory yang digabungkan dengan instance statis privat:

class AppConfig {
  static final AppConfig _instance = AppConfig._internal();
  
  String appName = 'MyApp';
  String version = '1.0.0';
  
  // Constructor bernama privat
  AppConfig._internal();
  
  // Factory constructor mengembalikan instance yang sama
  factory AppConfig() {
    return _instance;
  }
}

void main() {
  var config1 = AppConfig();
  var config2 = AppConfig();
  
  config1.appName = 'UpdatedApp';
  
  print(config2.appName);  // UpdatedApp
  print(identical(config1, config2));  // true
}

Konstruktor privat _internal() mencegah pembuatan instance dari luar. Field statis _instance menyimpan satu-satunya instance, yang dibuat sekali saat class dimuat. Setiap pemanggilan AppConfig() mengembalikan instance yang sama, sehingga perubahan yang dibuat melalui satu referensi terlihat di semua tempat.

Gunakan Singleton secukupnya, karena Singleton memperkenalkan state global yang dapat membuat pengujian lebih sulit. Singleton paling cocok untuk resource bersama yang benar-benar perlu memiliki state yang konsisten di seluruh aplikasi.

challenge icon

Tantangan

Mudah

Mari buat pengelola pengaturan game menggunakan pola Singleton! Kamu akan membuat sistem yang memastikan hanya ada satu instance pengaturan game di seluruh aplikasi, sehingga semua bagian game-mu menggunakan konfigurasi yang sama.

Kamu akan mengatur kodemu ke dalam dua file:

  • game_settings.dart: Buat class GameSettings yang menerapkan pola Singleton. Pengelola pengaturanmu harus memiliki:
    • Instance private static final yang menyimpan satu-satunya object GameSettings
    • Constructor bernama private untuk mencegah pembuatan instance dari luar
    • Constructor factory yang selalu mengembalikan instance yang sama
    • Tiga field pengaturan: difficulty (String, default: "Normal"), soundEnabled (bool, default: true), dan playerName (String, default: "Player1")
    • Method displaySettings() yang mencetak pengaturan saat ini dalam format ini: Settings: [playerName] | Difficulty: [difficulty] | Sound: [on/off] (cetak "on" jika soundEnabled bernilai true, dan "off" jika false)
  • main.dart: Impor pengaturan game-mu dan tunjukkan bahwa Singleton berfungsi dengan benar:
    • Dapatkan instance pengaturan dan beri nama settings1
    • Panggil displaySettings() untuk menampilkan nilai default
    • Ubah pengaturan: ubah playerName menjadi "Hero", difficulty menjadi "Hard", dan soundEnabled menjadi false
    • Dapatkan referensi lain ke pengaturan dan beri nama settings2
    • Panggil displaySettings() pada settings2 untuk membuktikan bahwa pengaturan tersebut mencerminkan perubahan yang dibuat melalui settings1
    • Cetak apakah settings1 dan settings2 identik menggunakan: Same instance: [true/false]

Ini menunjukkan manfaat utama Singleton: perubahan yang dibuat di bagian mana pun dalam aplikasi akan langsung terlihat di semua bagian lainnya, karena hanya ada satu instance!

Output yang diharapkan:

Settings: Player1 | Difficulty: Normal | Sound: on
Settings: Hero | Difficulty: Hard | Sound: off
Same instance: true

Coba sendiri

import 'game_settings.dart';

void main() {
  // TODO: Dapatkan instance settings dan beri nama settings1
  
  // TODO: Panggil displaySettings() untuk menampilkan nilai bawaan
  
  // TODO: Ubah pengaturan:
  // - Ubah playerName menjadi "Hero"
  // - Ubah difficulty menjadi "Hard"
  // - Ubah soundEnabled menjadi false
  
  // TODO: Dapatkan referensi lain ke settings dan beri nama settings2
  
  // TODO: Panggil displaySettings() pada settings2 untuk membuktikan bahwa perubahan tersebut tercermin
  
  // TODO: Cetak apakah settings1 dan settings2 identik
  // Format: Same instance: [true/false]
}
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 Dart online