Stateパターンで、修正前のコード内に、メッセージの表示用のオブジェクトprを毎回作成しているのに、気づいた方もいられるでしょう。
これでは、メモリーを無駄に消費する可能性があります。このために、常にひとつのオブジェクトしか持たないクラスがあれば、便利です。このクラスのパターンを Sigletonと呼びます。
インスタンスの数だけをコントロールするので、クラス内ではstaticで持っています。それでは、実際のJavaコードで見てみましょう。
元のコード:
class PrintPanel{
void Print(String s){
System.out.println(s);
}
}
Singletonパターンを適用したPrintPanelクラス:
class PrintPanel{
private static PrintPanel _instance;
public synchronized static PrintPanel instance(){
if (_instance == null){
_instance = new PrintPanel();
}
return _instance;
}
void Print(String s){
System.out.println(s);
}
protected PrintPanel(){}
}
このように、instance()が呼ばれたときに、すでに_instatnceが生成されていれば、そのオブジェクトを返して、そうでなければ、new PrintPanel()で生成します。
class EngineRunning extends EngineState{
PrintPanel pt = PrintPanel.instance();
void Up(EngineBoxeb){
pt.Print("No More Up");
eb.ChangeState(new EngineRunning());
}
void Down(EngineBox eb){
pt.Print("Down to idle from running");
eb.ChangeState(new EngineIdle());
}
void ShowCurrentState(){
pt.Print("State:running");
}
}
呼び出しについては、上記のようになります。
newで生成するのではなくて、PrintPabnel.instance()として、オブジェクトをもらうようにします。Singletonパターンのインスタンスの数は二つ以上にも拡張できます。実用上は、今回のEngineBoxと同様に、他のパターンと組み合わせて使うことが多くなるでしょう。