Pocket

こんにちは、Nitです。

今回から始まる『ネコわかるデザインパターン』では、
軽い気持ちでざっくりとデザインパターンをご紹介していこうと思います。
『ネコでも』ではありません。あしからず。

Singletonパターン

1回目はSingletonパターンをご紹介します。

Singletonパターンは、システムの中で「1つだけしか持ちたくない」という物があるときに使います。
有名なところで言うとJavaのCalender(カレンダー)クラスがこのパターンで作られています。
あとはインスタンスの作成や初期化に時間がかかるものにも有効です。

クラス図にするとこんな感じです。
singleton_01

赤字で書いたとおり、コンストラクタをprivateで宣言することで外部からインスタンスを作れないようにします。
Javaで書くとこうなります。

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

インスタンスの取得はgetInstance()関数を通して行います。
この時、最初の1回のみnewされ、あとは一度newしたものを使い回します。

ネコでいうならこう。
singleton_02

ところで今回ご紹介したソースはマルチスレッド対策として、
getInstance()関数に「synchronized」を付けて排他ロックをかけ、
スレッド間でデータの不整合が起きないようにしています。
しかしこの場合、他のスレッドでロックが外されるまで処理がwait状態になるため、
例えばSingletonにしたクラスをいくつも使用する場合などは

singleton_03

こんな感じになることがあります。
これが悪名高いデッドロックです。

こうならないように、処理の順番などを工夫しながら可愛がってあげてください。

第2回は反響と周りの顔色次第!
ネコ好きNitでした。