Singletonパターン

Singletonパターン

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と同様に、他のパターンと組み合わせて使うことが多くなるでしょう。