この記事は最終更新日から1年以上が経過しています。
@programming
投稿日 2019/7/12
Node.jsでシングルトンなクラスモジュール
Node.jsでシングルトンなクラスモジュールの作り方のメモです。Node.jsでシングルトンなモジュールの作り方は他にも色々ありますが、クラスでなおかつシンプルなやり方となると今回のやり方が一番シンプルではないかと思います。
では、クラスモジュールのシングルトン化を説明する前に、まずはおさらいで普通の(非シングルトンな)クラスモジュールの例から見ていきましょう。以下のような単純なクラスモジュールがあったとします。
// Foo.js
class Foo {
constructor() {
//
}
hello() {
console.log("hello!");
}
}
// export!
module.exports = Foo;
このクラスを使うときは大体このようにすると思います:
const Foo = require("./Foo.js");
const foo = new Foo();
foo.hello(); // "hello!"
説明するまでなく、Fooクラスをnewする度に新しいインスタンスが生成されます。
それでは、これをシングルトン化してみましょう。
シングルトン化
先ほどのFoo
クラスモジュールをシングルトン化すると以下のようになります:
シングルトンなクラス
// Foo.js
class Foo {
constructor() {
//
}
hello() {
console.log("hello!");
}
}
// export as singleton:
module.exports = new Foo();
上記のコードでやっていることは、Foo
クラス自身ではなくFoo
のインスタンスをmodule.exports
にセットしているだけです。たったこれだけで、Fooクラスの中身自体を弄ることなくシングルトン化できます。
このシングルトンクラスを使う時はこのようにします:
const Foo = require("./Foo.js");
Foo.hello(); // "hello!"
おまけ: ブラウザ対応のクラスモジュール
せっかくなのでブラウザ対応のクラスモジュールのシングルトン化もメモしておきます。
たとえば以下のようなブラウザ対応クラスモジュールがあるとします。
ブラウザ対応クラスモジュール
// Foo.js
class Foo {
constructor() {
//
}
hello() {
console.log("hello!");
}
}
// export with browser support!
if (typeof module !== "undefined" && typeof module.exports !== "undefined") {
module.exports = Foo;
} else {
window.Foo = Foo;
}
これをシングルトン化すると以下のようになります。やっていることは先ほどまでのシングルトン化の手法と同じです:
シングルトンなブラウザ対応クラスモジュール
// Foo.js
class Foo {
constructor() {
//
}
hello() {
console.log("hello!");
}
}
// export as singleton with browser support!
if (typeof module !== "undefined" && typeof module.exports !== "undefined") {
module.exports = new Foo();
} else {
window.Foo = new Foo();
}
以上です。