Re: Singleton
すぎたです。
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
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735