2008年12月20日土曜日

シングルトン

Singletonはデザインパターンの中でも、最もよく知られたパターンではないだろうか。直感的に理解しやすく、また、実装もシンプルだからだろう。ところで、ActionScriptでは、このシングルトンの実装には一工夫が必要になる。なぜなら、publicなコンストラクタしか許されないからだ。

様々な人が、それぞれの工夫を凝らしているようだが、大きくタイプは二つに分かれるようだ。1つは、internalクラスを用いる方法。実装例はこのようになる。

package {
  public class MySingletonA {
    private static var _instance:MySingletonA;

    public function MySingletonA(a:Blocker) {
    }

    public static function getInstance():MySingletonA {
      if (_instance == null) {
        _instance = new MySingletonA(new Blocker());
      }
      return _instance;
    }
  }
}

internal class Blocker { }


もう1つは、フラグを用いる方法だ。実装例はこのようになる。

package {
  import flash.errors.IllegalOperationError;

  public class MySingletonB {
    private static var _lock:Boolean = true;
    private static var _instance:MySingletonB;

    public function MySingletonB() {
      if(_lock) {
        throw new IllegalOperationError("シングルトンです。");
      }
    }

    public static function getInstance():MySingletonB {
      if (_instance == null) {
        _lock = false;
        _instance = new MySingletonB();
        _lock = true;
      }
      return _instance;
    }
  }
}



個人的には、前者の方法の方がいいように思える。なぜなら、勝手にインスタンスを作ろうとすると、コンパイル時にエラーになるからだ。一方、後者では、そのコードが実行されるまで、エラーは気づかれない。実装は素直にみえるが、この点が問題になる。

0 件のコメント: