実際にアプリを開発する上で便利とされるシングルトンですが、いまいちどのような時に使うのかイメージしにくかったので調べました。
■そもそもSingleton パターンとは
Wikipediaによると、「オブジェクト指向のコンピュータプログラムにおける、デザインパターンの1つである。」「Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。」とのこと。
・・・わからない。。
■Singleton パターンってどんなイメージ?
「クラスのインスタンスが1つしか生成されないことを保証することができる」というイメージに関して、サンプルケースが記載されている記事を引用します。
「サンプルケースでは、図書館の貸出帳を考えて見ます。図書の貸出に当たって、その貸出帳がいくつあるのかわからないような状態では、、管理がとても難しくなります。例えば、「ゼロからはじめるJava」は貸し出し中ですか?と質問されたとき、貸出帳が何冊あるのか分からなければ、「この貸出帳によると、現在図書館にあるはずですが、貸出帳は他にもあるかもしれないし・・・」なんてことになりかねません。こんなとき「貸出帳はこの1冊のみ」と保証されていれば、本が貸し出し中であるのか、図書館にあるのかすぐに判断できます。」
引用:5. Singleton パターン | TECHSCORE(テックスコア)
なんとなくイメージできたかも。
■どんな時に使うの?
Apple Developerのサイトによると、使用場面に関して以下のように書かれています。
「シングルトンは、オブジェクトのグローバルにアクセス可能な共有インスタンスを提供します。サウンドエフェクトを再生するオーディオチャンネルやHTTPリクエストを作成するネットワークマネージャなど、アプリケーション全体で共有されているリソースまたはサービスに統一されたアクセスポイントを提供する方法として、独自のシングルトンを作成できます。」
引用:Using Swift with Cocoa and Objective-C (Swift 4.1): Adopting Cocoa Design Patterns
なるほど。
■具体的な事例を考えてみる
例)ある画面Aで音楽を再生させて、別の画面Bで音楽を停止させる場合
1.画面Aと画面Bそれぞれで音楽の操作に関するインスタンスを生成するのは面倒かつメモリを食ってしまう。しかも可読性にも影響しそう。
↓
2.画面Aと画面Bの音楽の操作を司るクラスを作る方がよい。
↓
3.音楽の操作を司るクラスを作ったとして、Singleton パターンを適用しない場合。音楽の操作に関するクラスを画面A、画面Bそれぞれでインスタンス化して、さらにそれぞれで内容を変更すると、音楽の操作に関して不整合が起こる可能性がある。
そこで、アプリケーション内でインスタンスが1つになるように保証するSingleton パターンを適用すれば、不整合が起きないようにしつつ、可読性の確保やメモリの管理がよりよい状態になる。
みたいな感じでしょうか。
参考:Java - シングルトンがなぜ必要なのか(36721)|teratail
■Singleton パターンの書き方
Apple Developerのサイト(Using Swift with Cocoa and Objective-C (Swift 4.1): Adopting Cocoa Design Patterns))と、Swift で簡単なシングルトンの実装方法 - Qiitaを参考にさせていただきました。