😺

Dartにおけるシングルトンの使い方

2023/03/08に公開

Dartにおけるシングルトンクラスの初期化は、通常のクラスの初期化と同じように行いますが、インスタンスが1つしかないことが保証されます。

以下は、Dartにおけるシングルトンクラスの例です。

class MySingleton {
  static final MySingleton _instance = MySingleton._internal();

  factory MySingleton() {
    return _instance;
  }

  MySingleton._internal() {
    // 初期化コード
  }
}

この例では、_instanceというプライベートな静的フィールドが宣言され、MySingletonクラスのインスタンスを保持します。_instanceフィールドは、factoryキーワードが付いたMySingleton()メソッドを介してアクセスできます。_instanceフィールドの初期化は、MySingleton._internal()コンストラクタで行われます。

MySingletonクラスを使用する場合は、次のように書きます。

MySingleton singleton = MySingleton();

このようにしてインスタンスを作成すると、MySingleton()ファクトリメソッドは_instanceを返します。すなわち、singletonは_instanceと同じインスタンスになります。このように、シングルトンクラスは、アプリケーション全体で1つのインスタンスを持ち、そのインスタンスにアクセスするためにMySingleton()ファクトリメソッドを呼び出すだけで済むようになります。

具体例としてgeoCodingクラスをシングルトンで作成します。
以下は、Dartにおけるシングルトンパターンを使用して、Geocodingクラスを初期化し、チェーンメソッドで住所を変換し、結果を表示する例です。

import 'package:geocoding/geocoding.dart';

class GeocodingService {
  static final GeocodingService _instance = GeocodingService._internal();

  factory GeocodingService() {
    return _instance;
  }

  GeocodingService._internal() {
    // 初期化コード
    GeocodingPlatform.instance.locationFromAddress("1600 Amphitheatre Parkway, Mountain View")
        .then((locations) {
      print(locations);
    });
  }

  Future<List<Location>> getLocationFromAddress(String address) {
    return GeocodingPlatform.instance.locationFromAddress(address);
  }
}

void main() {
  GeocodingService geocodingService = GeocodingService();
  geocodingService.getLocationFromAddress("1065 La Avenida St, Mountain View")
      .then((locations) {
    print(locations);
  });
}

上記の例では、GeocodingServiceクラスはシングルトンとして実装され、GeocodingPlatform.instanceを使用して、住所を座標に変換するためのAPIを呼び出しています。このクラスは、getLocationFromAddressメソッドを公開し、住所を引数として渡すことができます。

メイン関数では、GeocodingServiceクラスのインスタンスを作成し、getLocationFromAddressメソッドを使用して住所を変換し、結果を表示しています。同時に、GeocodingServiceクラスのコンストラクタが呼び出され、別の住所の座標変換も実行されます。

このようにして、シングルトンクラスを使用することで、アプリケーション全体で1つのGeocodingServiceインスタンスを保持し、住所を変換するためにgetLocationFromAddressメソッドを呼び出すだけで済むようになります。

Discussion