2016年9月7日水曜日

Singletonパターン

今回はSingletonパターンを紹介しますね。

Singletonパターンはクラスのインスタンスをアプリケーション内で一つだけ生成するパターンです。

クラスのインスタンスを一つだけに制限したい例はいくらかあるでしょう。

例えば、ファイルアクセス、ロギング処理、キャッシュ、コネクションプールなどでしょうか。

実際これらのオブジェクトを2つ以上インスタンス化したら、

プログラムの誤動作やつじつまの合わない結果といったあらゆる問題が起きてしまいます。

ではどんな感じで実装するのか見てみましょう。

// シングルトン
public class Singleton {
private static Singleton instance = new Singleton(); // static初期化でインスタンス生成
private Singleton() { }; // コンストラクタはprivateであること
public static Singleton getInstance() { // インスタンスの取得はこのstaticメソッドで取得
return instance;
}
public void print(String s) {
System.out.println(s);
}
}

// メインクラス
public class Client {
public Client() {
Singleton s1 = Singleton.getInstance();  // 1回目
s1.print("こんにちは。シングルトン1");
Singleton s2 = Singleton.getInstance();  // 2回目
s2.print("こんばんは。シングルトン2");
if (s1 == s2 ) {
System.out.println("同じインスタンス");
}
System.out.println("シングルトン1" + s1);
System.out.println("シングルトン2" + s2);
}

public static void main(String[] args) {
new Client();
}
}

ここではシングルトンインスタンスを2回要求した後で、
同一のインスタンスかどうかを s1 == s2 によってチェックしています。
このプログラム実行結果は下記になりました。

・実行結果
こんにちは。シングルトン1
こんばんは。シングルトン2
同じインスタンス
シングルトン1jp.co.kouji.umeda.core.Singleton@2e4f7bc2
シングルトン2jp.co.kouji.umeda.core.Singleton@2e4f7bc2

Singleton.getInstance();を二回呼び出してますが、

実行結果はシングルトン1とシングルトン2が同じインスタンスになってますね。

ここでは簡易的な例にしましたが通常は上記で記載されている通り、

ロギングやキャッシュなどのアクセスオブジェクトとして使われたりします。


人気ブログランキングへ

0 件のコメント:

コメントを投稿