Singleton(シングルトン)ってなによ?ってことをまとめてみました。
特にc#やUnityの機能では無く、プログラミングの手法というか設計のレシピです。 で、このシングルトンとはどのような設計かというと、
クラスのインスタンスが1個しかつくれない
別の言い方をすると、インスタンスが1つということが決まっている。 というプログラムの組み方です。
何が便利かって、newされまくって、同じ情報が至る所に重複するようなリソースの無駄遣いを防げますし、 いろんな所から参照されても、情報は1つだと言うことは保障されるので、グローバルな管理データなんかを突っ込んでおくのに便利です。
もちろん自分で1個しか作らないとルール決めて運用して、それがキッチリ守られるのであれば、使う必要は無いんですが。 世の中には、うっかり、聞いてない、オレのやり方じゃない、などルールから外れてしまうことが多々あります。
なので、もう設計段階で作っておこうということですね。
実装概要
- シングルトンにしたいクラスにstaticなクラス変数を用意
- これでグローバルでインスタンスが参照可能
- コンストラクタをprivateに指定
- シングルトンクラス自身以外からコンストラクタの呼出し(newが使えなくなる)ができないようになる
- 外部よりインスタンスを取得するメソッドを用意
こうすれば、勝手にインスタンスを作れないので、インスタンスが1つであることが保障される訳です。
Unity C#で書いてみる
using UnityEngine; public class Singleton { private static Singleton instance = null; //(1) private Singleton(){ //(2) Debug.Log("Constructor"); } public static Singleton Instance { //(3) get { if( instance == null ) instance = new Singleton(); return instance; } } }
利用する際には、
Singleton singleton = Singleton.Instance;
といった感じで引っ張ってもらったら、(3)のgetterのところで、nullだったらインスタンス作成。 既に存在する場合は、そのままインスタンスを返します。
まぁ、今回はシングルトンとはなんぞやってところの話なので、
実践的にUnityにシングルトンを実装しようとするなら、MonoBehaviourの話や、実行タイミングなども絡んできますので、いろいろ他に参考にするのが吉だとおもいます。