JavaScript では、シングルトン パターンの設計はいくつかの方法で実現できます。シングルトン パターンでは、クラスのインスタンスが 1 つだけ存在することが保証され、グローバル アクセス ポイントが提供されます。以下は、Immediately Invoked Function Expressions (IIFE) とクロージャを使用したシングルトン実装です。
const Singleton = (function () {
let instance;
function createInstance() {
const obj = new Object("我是单例模式的实例");
return obj;
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
},
};
})();
// 使用单例模式
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log("两个实例是否相等:", instance1 === instance2); // 输出:两个实例是否相等:true
この場合、メソッドを使用してオブジェクトSingleton
を返す即時関数式です。このメソッドは、シングルトン インスタンスが既に存在するかどうかを確認し、存在しない場合は新しいインスタンスを作成する役割を果たします。存在する場合はこのインスタンスを返します。JavaScript のクロージャーの性質により、変数は常にスコープ内に存在し、インスタンスが 1 つだけ作成されることが保証されます。getInstance
getInstance
instance
Singleton
このアプローチにより、インスタンスが 1 つだけ存在し、アプリケーション全体でアクセスできることが保証されます。
JavaScript でのシングルトン パターンの他の実装方法を引き続き理解すると、ES6 クラスを使用してシングルトン パターンを実現できます。以下はクラスと静的メソッドを使用した例です。
class Singleton {
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
Singleton.instance = this;
}
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}
// 使用单例模式
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log("两个实例是否相等:", instance1 === instance2); // 输出:两个实例是否相等:true
Singleton
このES6 クラスの場合、コンストラクターはシングルトン インスタンスが既に存在するかどうかを確認します。存在する場合はこのインスタンスを返し、存在しない場合は現在のインスタンスをそれに割り当てますSingleton.instance
。getInstance
このクラスは、シングルトン インスタンスを取得するための静的メソッドも提供します。を呼び出すとSingleton.getInstance()
、インスタンスが 1 つだけ作成されて返されることが保証されます。
このアプローチでは ES6 クラスと静的メソッドを最大限に活用し、コードをより簡潔で理解しやすくしています。ただし、このアプローチは、ES6 クラス構文をサポートしていない古いブラウザでは機能しない可能性があることに注意してください。
引き続き、オブジェクト リテラルを使用して実現できる JavaScript シングルトン パターンの実装について学習してください。オブジェクト リテラル アプローチは、単純なオブジェクトを必要とするシナリオ向けのシンプルで理解しやすい実装です。以下は、オブジェクト リテラルを使用して実装された例です。
const Singleton = {
instance: null,
getInstance: function () {
if (!this.instance) {
this.instance = {
message: "我是单例模式的实例",
showMessage: function () {
console.log(this.message);
},
};
}
return this.instance;
},
};
// 使用单例模式
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log("两个实例是否相等:", instance1 === instance2); // 输出:两个实例是否相等:true
この場合、プロパティとメソッドSingleton
を含むオブジェクト リテラル。このメソッドは、シングルトン インスタンスが既に存在するかどうかを確認し、存在しない場合は新しいインスタンスを作成してプロパティに割り当てます。存在する場合はこのインスタンスを返します。プロパティはオブジェクトの一部であるため、アプリケーション全体でインスタンスが 1 つだけ存在します。instance
getInstance
getInstance
instance
instance
Singleton
このアプローチはシンプルで理解しやすく、単純なオブジェクトを必要とするシナリオに適しています。ただし、継承メソッドやインスタンス メソッドが必要な複雑なシナリオでは、この方法は適切ではない可能性があります。
要約すると、JavaScript でシングルトン パターンを実装するいくつかの方法を紹介しました。
- 即時呼び出し関数式 (IIFE) とクロージャーを使用します。
- ES6 クラスと静的メソッドを使用します。
- オブジェクト リテラルを使用します。
プロジェクトの要件と互換性に基づいて、適切な実装を選択できます。シングルトン パターンは、グローバル状態管理、共有リソース アクセスなど、多くのシナリオで非常に役立ちます。