はじめに
Flutter (というかDart)を使ってのシングルトンパターンに関する記事です。
シングルトンパターン
インスタンスを1つしか作らないことを保証したデザインパターンです。インスタンスの一貫性が保証されるため、アプリケーション全体でグローバルに使用したいデータや状態を保持したいときに使用されます。
環境
- MacOS BigSur 11.4
- Flutter 2.5.2
- Dart 2.14.3
サンプルコード
通常
シングルトンではない通常パターンです。 Human()
するごとにインスタンスが作成されるのがわかります。
class Human {
String _name = "John";
String get name => _name;
}
void main() {
Human human1 = Human();
Human human2 = Human();
if (human1 == human2) {
print("Same Human!");
} else {
print("human1 and human2 are not the same.");
}
}
実行結果:
human1 and human2 are not the same.
シングルトンパターン
シングルトンパターンです。Human()
しても同じものが返却されます。
class Person {
static final Person _singleton = new Person._internal();
static final String _name = "John";
static String get name => _name;
factory Person() {
return _singleton;
}
Person._internal();
}
void main() {
Person person1 = Person();
Person person2 = Person();
if (person1 == person2) {
print("Same Person!");
} else {
print("person1 and person2 are not the same.");
}
}
実行結果:
Same Person!
このように、Humanでは都度インスタンスが作成され、Personでは同じインスタンスが取得できています。不思議ですよね。使い方は同じように見えるのに実際使うと挙動は全く異なる。
どうしてこんな動きになるかというと、その秘密はfactory
にあります。クラスのコンストラクタにfactoryとあるのがわかるでしょうか。factoryはインスタンスを常に作成するのではなく前に作成されたインスタンスのキャッシュがあればそれを返す、という動きをします。これでシングルトンパターンが成立するんですね。
宣伝
シングルトンパターンを使っているFlutterアプリはこちら
Androidはこちら
iOSはこちら