すぎたです。

In message news:bgnicn$s02$1@nn-os103.ocn.ad.jp
"Abu" <abu.news@abusys.biz> wrote ...

> JavaScriptでSingletonパターンを実現することは可能でしょうか?
> 可能であればどのような方法がありますでしょうか。

C++もJavaもデザインパターンもやった事無いのでよくわからないのですが、
なにか面白そうということで、あちこち見て(Yahooで調べたり本見たり)
作ってみました。
# JavaScriptではあかまさんもおっしゃっているように、実現できなさ
# そうな気がするのですが、出来る範囲ということで。
## インスタンスが生成されないわけじゃなく、単に利用しないと
## というだけなので、コンストラクタの書き方によってまずい
## ケースは多々あると思います。
### そのまえに、根本的に勘違いしてるかも・・・

で、最初に書いたのが、

=== singleton.js ===
  function Singleton() {
    if (!Singleton.prototype._instance) {
      Singleton.prototype._constructor();
      Singleton.prototype._instance = Singleton;
    }
    return Singleton.prototype._instance;
  }
  Singleton.prototype._constructor = function () {
    var _registry = new Array();
    function Lookup(_name) {
      return _registry[_name];
    }
    Singleton.Register = function (_name, _instance) {
      if (!_registry[_name]) {
        _registry[_name] = _instance;
        return true;
      } else {
        return false;
      }
    }
    Singleton.Instance = function (_name) {
      return Lookup(_name);
    }
  }
  Singleton();


次に、変化球的なのが、

=== singleton.js ===
  Singleton = new function () {
    var _registry = new Array();
    function Lookup(_name) {
      return _registry[_name];
    }
    this.Register = function (_name, _instance) {
      if (!_registry[_name]) {
        _registry[_name] = _instance;
        return true;
      } else {
        return false;
      }
    }
    this.Instance = function (_name) {
      return Lookup(_name);
    }
  }


以下、テストコード

=== test.html ===
  <script src="singleton.js"></script>
  <script>
  function test() {
    function debugln(msg) {
      dbg.document.writeln(msg+"<br>");
    }
    function Apple() {
      if (Singleton.Register("Apple", this)) {
        var _s = 0;
        this.Stock = function (_n) {
          _s += _n;
          debugln("Appleを"+_n+"個ストックしました。残り"+_s+"個です。");
        }
        this.Eat = function (_n) {
          if (_s >= _n) {
            _s -= _n;
            debugln("Appleを"+_n+"個食べました。残り"+_s+"個です。");
          } else {
            debugln("Appleは"+_n+"個確保できません。残り"+_s+"個です。");
          }
        }
      }
      return Singleton.Instance("Apple");
    }

    var tanaka = new Apple();
    var wada   = new Apple();

    tanaka.Stock(5);
    tanaka.Eat(3);
    wada  .Eat(1);
    tanaka.Eat(2);
    wada  .Stock(5);
    tanaka.Eat(2);
  }
  </script>
  <body onload="test()">
  <iframe name="dbg" style="width:100%; height:100%"></iframe>
  </body>


=== 結果 ===
  Appleを5個ストックしました。残り5個です。
  Appleを3個食べました。残り2個です。
  Appleを1個食べました。残り1個です。
  Appleは2個確保できません。残り1個です。
  Appleを5個ストックしました。残り6個です。
  Appleを2個食べました。残り4個です。


# テストコードは以下を参考にしました。
# http://member.nifty.ne.jp/yamazaki/doc/cpp_design_pattern.html#Singleton

--
杉田
sugi-nws@bk.iij4u.or.jp