ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Singleton

インスタンスを1つしか作成しないようにする。
あるクラスを1個しかインスタンスを作らないように制限をかける。プログラマが1個しか作らないように注意してコーディングすればいいじゃんという話もあるが、自分ひとりでプログラムするならまだしも、複数人でプログラムを作成する場合などには誰かが誤ってインスタンスを複数作成してしまうかもしれない。こうならないようにコードでインスタンスが1個しか生成されないように制限をかける。

class Singleton
{
private:
    static Singleton singleton = new Singleton();
    Singleton() { }
public:
    static Singleton getInstance()
    {
        return singleton;
    }
};


void doTest()
{
    Singleton obj = Singleton.getInstance();
}

他のクラスからnewできないようにコンストラクタをprivateにすることが重要。この例ではプログラム実行開始時にインスタンスが生成される。
さて、次のように書くこともできる。

class Singleton
{
private:
    static Singleton singleton = null;
    Singleton() { }
public:
    static Singleton getInstance()
    {
        if ( singleton == null )
        {
            singleton = new Singleton();
        }
        return singleton;
    }
};

この例だと、初めてgetInstance()が呼び出されたときにインスタンスが生成される。しかし、このままだとマルチスレッドで同時にgetInstance()が呼び出された場合、複数のインスタンスが生成されてしまう可能性がある。スレッドセーフにしなければならない。
ゲームで使う場合としては、タスクシステムを実装したときのタスクの管理を行うタスクマネージャーがSingletonであるべきかな。またテクスチャやモデルデータを管理するリソース管理マネージャーとかも。なんちゃらマネージャーというのはSingletonが適しているのかな。


※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない
参考文献:Java言語で学ぶデザインパターン入門
参考:
ギコ猫とSingletonパターン
Singleton パターン - Wikipedia