2010年11月25日木曜日

Singletonパターン

Singletonパターン(シングルトン)を使用する場合、そのクラスのインスタンスが1つしか生成されないことを保証することができます。
Singletonパターンでは、様々なクラスから呼び出しが可能となります。
ただし、ステートフルに実装してしまうと、グローバル変数のように、プログラムの依存性が煩雑化し、構造が悪化するケースがあります。
安易にシングルトン化することは、非常に危険な行為ですので、十分に考慮する必要があります。



実装例
  • コンストラクタはprivateで定義する。
  • staticで、かつprivateで自分のインスタンスをもつ。
  • staticメソッドでgetInstance()メソッドを定義する。




public class MySingleton {
private static final MySingleton singleton = new MySingleton();
private MySingleton(){}
public static MySingleton getInstance(){
return singleton;
}
}




誤った実装例

以前、以下のような中途半端なSingletonを見たことがあります。



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


上記の実装を行った場合、getInstance()が非同期呼び出しに対応できていません。
そのため、getInstance()をsynchronizedする必要が出てきます。もし、synchronizedした場合、呼び出し単位で同期をとるため、性能への影響が発生します。

0 件のコメント: