【Flutter】キー毎のシングルトン(マルチトンパターン)クラスの実装【Dart】

2025/02/25に公開

はじめに

シングルトンパターンは、クラスのインスタンスが1つだけ存在することを保証するデザインパターンとして広く知られています。しかし、特定のキーに対して1つのインスタンスが存在するという、「キー付きシングルトン」や「マルチトンパターン」と呼ばれる変形パターンが必要になることもあります。

この記事では、Dartを使用してキーごとに1つのインスタンスだけを持つクラスを実装する方法について説明します。

通常のシングルトンパターン

通常のシングルトンパターンの実装例は、過去に記事にしました。

https://zenn.dev/shinkano/articles/c0f392fc3d218c

キー付きシングルトン(マルチトン)パターン

以下は、キーごとに1つのインスタンスを持つパターンの実装方法です。

class KeyedSingleton {
  // プライベートなコンストラクタ
  KeyedSingleton._(this.key);
  
  // キーごとにインスタンスを保持するマップ
  static final Map<String, KeyedSingleton> _instances = {};
  
  // このインスタンスのキー
  final String key;
  
  // ファクトリコンストラクタ
  factory KeyedSingleton(String key) {
    return _instances.putIfAbsent(key, () => KeyedSingleton._(key));
  }
  
  void someMethod() {
    print('キー「$key」のインスタンスのメソッドが呼ばれました');
  }
}

ポイント

  • 静的なマップ _instances を使用して、キーとそれに対応するインスタンスを格納します
  • factory コンストラクタは putIfAbsent メソッドを使用して、キーが既に存在する場合は既存のインスタンスを返し、存在しない場合は新しいインスタンスを作成して返します

おわりに

特定のキーに対して1つのインスタンスだけが存在することを保証するキー付きシングルトンパターン(マルチトン)の紹介をしました。

このパターンは、設定管理、リソース管理、キャッシング機構など、多くのユースケースで有用です。

Fivot Tech Blog

Discussion