💭

シングルトン、なんそれ。factory、なんそれ。

2023/01/11に公開

『シングルトン』ってなんそれ。

多分、シングルで単一的な事なんやろ。
Dart特有のさぁ、あれだよあれ。
Dartって確かGoogleが開発したやつだから天才が考えたすげぇやつだと思うよ。知らんけど。

まぁ、でも、横文字って使うと何かかっこいい気もするし、
知ったかして、デカい顔できたら良いなと思ったから
ちょっと調べてみるわ。

(調べ中......)

うん、よく分かりそうで分からん

https://note-tmk.hatenablog.com/entry/2022/08/18/231752

ふむふむふむ。

シングルトンって、
『あるクラスのインスタンスが一つだけ生成される』 らしい。(引用)

こういう文字ばかりの記事って眠くなるから
パッと流し読みしながら重要そうなワードだけ見て
理解したような気でメモしていく。

で、普通に思った感想は、

クラスが1つだけインスタンス化...。
はにゃ

え、シンプルにどういう事。
クラスは作れば作るだけ存在するんじゃないの

例えばこれとかさぁ↓

class Test {
  final String text;
  final int count;

  Test(this.text, this.count);
}

void main() {
  final test1 = Test('test1', 10);
  final test2 = Test('fuck', 1000000000);
}

これって、test1、test2にそれぞれTestクラスが爆誕して、
2つのインスタンスが出来たって事でしょ。

これを1つだけに統一するだと...。なんやそれ。どこで使うねん。

こんなもん。どこで使うねん。

クラスのサイズが大きいケース
設定情報やログ情報など、情報を単一にまとめることに意味のあるケース

うん、1つ目は理解できん。よく分からん。
2つ目は、なんとなく理解できた。

それこそ、自分だけのプロフィールを編集するようのクラスとかを使いたい場合はあるかも。
多分例としてはビビるくらい悪いけど、ごめん。
プロフィールなんて色々なユーザーの編集したいもんな。笑

なんか良い例ないかなぁ。。。

(...)

チャットルームとかはどう?
LINEとかのチャットルームって、NavigationBarの左から2番目にあるけど
あの時くらいしかUI表示でデータ使わんもんな。

あんな特殊なチャットルームのクラスは1つだけで良いけど、
様々な場面で中の変数を参照したいから、
シングルトンが良いのかも。

でも、デカいデータってのがよく分からん。
まぁ、デカい複数のデータを扱う時とかってある意味で何個も作る事ないなと書きながら思った。

呪文

class Test {
  static final Test _test = Test._internal();

  factory Test() {
    return _test;
  }

  Test._internal();
}

これがシングルトンクラスを生成する際の使い方だってさぁ。
訳が分からん。なんこれ。呪文やん。

factory:なんそれ。
_internal:なんこれ。

うーむ。さっぱり訳わかめ。

いったん無視して次や次

上記の呪文を活用して、本当にクラスが複数ではなく
1つしか作られないのかを検証する

class Test {
  static final Test _test = Test._internal();

  factory Test() {
    return _test;
  }

  Test._internal();

  int count = 0;

  void plusCount() {
    count++;
  }
}

void main() {
  final test1 = Test();
  print(test1.count); // 0
  test1.plusCount();
  print(test1.count); // 1

  final test2 = Test();
  print(test2.count); // 1
}

とりま、countを増やすような動きを作ってみた結果、
ちゃんとシングルトンとして動きました。

やるやん。

でも、謎すぎ。まぁ、ええか、動いたし。

え、グローバル変数で良くない?

https://zenn.dev/pressedkonbu/books/flutter-reverse-lookup-dictionary/viewer/028-singleton#グローバルな変数、関数ではダメなのか

あぁ、無惨にも俺が思った疑問を瞬殺する記事が見つかってしまった。

グローバルにしてしまうと、変数名の幅が限られるし、同じようなものが羅列されるとややこしい。
あと、クラス分けすることで、変数のポジショニングがしっかりされる。
と言っています。

ほんま、その通りやわ。かしこ。

factory、なんこれ

正味、一番意味不明なのがこいつよこいつ
factoryさんです。

マージで、どちら様?って感じではあるけど
色々と調べた結果、理解してもせんでも良さそう。
ってのが分かった。

まぁ、ざっくり理解で行くなら、
シングルトンクラスでも、通常のクラス(複数作られる方)でも
両方でもメソッドを上手く使えるよみたいな感じのノリで、
常にそのクラスのインスタンスを生成しなくても良いってのが便利よね。

どっちか絞れよ!!と突っ込んだけど
今思うと、両方そつなくこなせるのは、凄いなと普通に思った。

もし困ったらこいつを使う。
ってことも場合によっては出来るっぽい。

でも、色々と漁ってると、fromJsonとかで使用している例が圧倒的に多い気もする。
それ以外はシングルトンのインスタンス化の上記の呪文以外はあまり使われないのかなと予想してます。
でも、ここら辺はマジで自信ないし、結構間違ってる、もしくは厳密性に差がある場合があるから自分で調べて。

https://dart.dev/guides/language/language-tour

Factory constructors
Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype. Another use case for factory constructors is initializing a final variable using logic that can’t be handled in the initializer list.

翻訳:ファクトリー コンストラクタ
常にそのクラスの新しいインスタンスを作成するわけではないコンストラクタを実装する場合は、ファクトリーキーワードを使用します。たとえば、ファクトリーコンストラクタはキャッシュからインスタンスを返したり、サブタイプのインスタンスを返したりすることがあります。ファクトリー コンストラクタのもう 1 つの使用例は、初期化リストで処理できないロジックを使用して最終的な変数を初期化することです。

理解は全く出来んかったけど

あまり、ビクビクとビビる必要はない事が分かった。
シングルトンも、factoryも普通にある意味ただのクラスと前についてる接頭辞みたいなもんやから、
特別視する事はないなと。

多分、理解が進んで賢くなっていければもっと考える事が多くなるんだろうけど
今のレベルじゃ無理。

でも、これでも前に進んだ事がすごい。おめでとう俺。

Discussion