【Flutter/Dart】状態管理 Providerパッケージ
asoacasio
プログラマーの裏舞台
Dart言語でシングルトンパターンを説明します。
シングルトンは、システム内で1つしかインスタンスを存在させません。
に、シングルトンは効果を発揮します。
例を紹介します。
システム全体のログファイルを作りたい場合に、1つのインスタンスによって制御されるべきです。
ブラウザのセッション全体で1つのみ存在すべきです。
同じリソースがどこからでもアクセスでき、共有されることが理想です。
システムの設定値(スマホでいうとWi-FiやBluetoothのON/OFFなど)は、どこからでもアクセスでき、インスタンスは1つであるべきです。
シングルトンのイメージがつきやすいように、校長先生を例にしてサンプルコードを書いてみます。
import 'dart:developer';
class Principal {
// シングルトンオブジェクト(校長先生)を保存するための変数
static final Principal _principal = Principal._internal();
factory Principal() {
return _principal;
}
Principal._internal();
String _schoolRules = "遅刻はダメです。";
// 校則を設定するメソッド
void setSchoolRules(String rules) {
_schoolRules = rules;
}
// 校則を表示するメソッド
void displaySchoolRules() {
log('我が校の校則は - $_schoolRules');
}
}
void main() {
// 鈴木太郎という校長先生が居ます。
// 鈴木先生と呼ぶ人もいれば、太郎先生と呼ぶ人もいます。
// でも、鈴木先生も太郎先生も同一人物です。
final Principal suzuki = Principal();
final Principal taro = Principal();
suzuki.displaySchoolRules(); // [log] 我が校の校則は - 遅刻はダメです。
taro.displaySchoolRules(); // [log] 我が校の校則は - 遅刻はダメです。
suzuki.setSchoolRules("ガムは食べちゃダメです。");
suzuki.displaySchoolRules(); // [log] 我が校の校則は - ガムは食べちゃダメです。
taro.displaySchoolRules(); // [log] 我が校の校則は - ガムは食べちゃダメです
}
クラスにおいて次の書き方は、ほぼお決まりの書き方です。
class Principal {
static final Principal _principal = Principal._internal();
factory Principal() {
return _principal;
}
Principal._internal();
}
factoryとは、常に新しいインスタンスを作らない場合に、使います。
キャッシュ、又はサブクラスのインスタンスを返します。
_internal()は、_()や_xxx()と同じです。
任意の命名でOKです。
アンダーバーの_をつけて、外部からインスタンスを生成させません。