おれ、Unity2Dでゲーム作るんだ。

Unity2Dをメインに、覚書などを記事にしていきます。

Singleton(シングルトン)ってなによ?

f:id:xev:20150124023327p:plain

Singleton(シングルトン)ってなによ?ってことをまとめてみました。

特にc#やUnityの機能では無く、プログラミングの手法というか設計のレシピです。 で、このシングルトンとはどのような設計かというと、

クラスのインスタンスが1個しかつくれない

別の言い方をすると、インスタンスが1つということが決まっている。 というプログラムの組み方です。

何が便利かって、newされまくって、同じ情報が至る所に重複するようなリソースの無駄遣いを防げますし、 いろんな所から参照されても、情報は1つだと言うことは保障されるので、グローバルな管理データなんかを突っ込んでおくのに便利です。

もちろん自分で1個しか作らないとルール決めて運用して、それがキッチリ守られるのであれば、使う必要は無いんですが。 世の中には、うっかり聞いてないオレのやり方じゃない、などルールから外れてしまうことが多々あります。

なので、もう設計段階で作っておこうということですね。

実装概要

  1. シングルトンにしたいクラスにstaticなクラス変数を用意
    • これでグローバルでインスタンスが参照可能
  2. コンストラクタをprivateに指定
    • シングルトンクラス自身以外からコンストラクタの呼出し(newが使えなくなる)ができないようになる
  3. 外部よりインスタンスを取得するメソッドを用意

こうすれば、勝手にインスタンスを作れないので、インスタンスが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の話や、実行タイミングなども絡んできますので、いろいろ他に参考にするのが吉だとおもいます。

tsubakit1.hateblo.jp