シングルトン クラスは、クラスのオブジェクト作成を Java 仮想マシン内で 1 つだけに制限します。また、オブジェクトへのグローバル アクセス ポイントを提供するのにも役立ちます。この設計パターンは、キャッシュ、Abstract Factory、ロギング、プロトタイプなどで一般的に使用されます。また、java.awt.Desktop、java.lang.Runtime などのコア Java クラスでも使用されます。 java.lang.Runtime では、Java はアプリケーションが実行されている現在のランタイム環境を示すクラス Runtime を提供します。これは、アプリケーションとランタイム環境のインターフェイスに役立ちます。 JRE は一意であるため、オブジェクトは 1 つである必要があります。 java.awt.Desktop では、Desktop クラスを使用して、アプリケーションがユーザーのデフォルトのブラウザ、メール クライアントなどで URI またはファイルを起動できるようにします。ここでも、クラスのインスタンスは 1 つだけ存在する必要があります。
シングルトン クラスは 2 つの方法で作成できます。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
次に、シングルトン クラスのクラス UML (統一モデリング言語) 図を見てみましょう。
クラス UML 図では、最初のパーティションはクラスの名前を表し、2 番目のパーティションは属性を表し、3 番目のパーティションはメソッドを表します。また、+ はパブリック属性またはメソッドを示し、- はプライベート属性またはメソッドを示します。たとえば、シングルトン クラスの UML 図では、クラス名は Singleton で、main メソッドがあります。上の図で公開されているメソッドは、main メソッド、getInstance メソッド、sampleMethod のみです。コンストラクターとインスタンスの属性は、実装の一部としてプライベートとして設定されます。このパブリック Main メソッドはインスタンスを要求し、getInstance はそれを main メソッドに返します。
インスタンス化に基づく、通常の Java クラスとシングルトン クラスの唯一の違いは、Java クラスではコンストラクターを使用するのに対し、シングルトンでは getInstance() メソッドを使用することです。
Singleton のデザイン パターンには 2 つの形式があります。
1.遅延インスタンス化
遅延インスタンス化では、必要なときにクラス インスタンスが作成されます。マルチスレッド環境で発生する可能性のある競合状態を回避するために、Synchronized メソッドまたはブロックで作成されます。
2.早期インスタンス化
早期インスタンス化では、ロード時にインスタンスが作成されます。これは最も単純なアプローチではありますが、アクセスの有無に関係なくインスタンスの作成が行われるという欠点があります。
遅延インスタンス化と早期インスタンス化の例については、次のセクションで説明します。
上で説明したように、シングルトン クラスは早期インスタンス化または遅延インスタンス化で作成できます。
次に、遅延インスタンス化を実装する手順を示します。
1.コンストラクターをプライベートとして設定します。
たとえば、LazyClass というクラスを作成しています。コンストラクタは以下のようになります。
private LazyClass () { }
2.作成したクラスのプライベート静的インスタンスを作成します。
private static LazyClass instance;
3.クラスインスタンスを作成する静的同期メソッドを作成します。
public static synchronized LazyClass getInstance() { }
4. getInstance()メソッドでは、まずインスタンスが存在するかどうかを確認します。見つからない場合は作成します。それ以外の場合はインスタンスを返します。
if(instance == null) { instance = new LazyClass (); } return instance;
それでは、サンプルコードを使用して見てみましょう。
//Java Program for Lazy Instantiation public class LazyClass { private static LazyClass instance; //set the constructor as private private LazyClass () {} //Checks whether an instance is already in the getInstance method public static synchronized LazyClass getInstance() { //if instance is not present already, create a new one if(instance == null) { instance = new LazyClass (); } // if an instance is present, then return it return instance; } //Sample method that is protected from more than one object creation public void sampleMethod( ) { System.out.println("sampleMethod for lazy singleton"); } public static void main(String[] args) { LazyClass temp=LazyClass.getInstance(); temp.sampleMethod(); } }
出力:
ここでは、ロード時にインスタンスを作成するのではなく、同期ブロック内でインスタンスが作成されます。理解を深めるために、複数のオブジェクトの作成から保護されているサンプル メソッドも示します。
次に、早期インスタンス化の手順を見てみましょう。これは、同期されたメソッドやブロックを使用しないことを除いて、遅延インスタンス化に似ています。
1.コンストラクターをプライベートとして設定します。
たとえば、EarlyClass というクラスを作成します。コンストラクタは以下のようになります。
private EarlyClass () () { }
2.作成したクラスのプライベート静的インスタンスを作成します。
private static EarlyClass <em>ins</em>= new EarlyClass();
3.クラスインスタンスを作成する静的メソッドを作成します。
public static EarlyClass getInstance() { }
以下は、早期インスタンス化のサンプル コードです。
//Java Program for Early Instantiation public class EarlyClass { //Create an instance of the class at load time private static EarlyClass <em>ins</em>= new EarlyClass(); //set the constructor as private private EarlyClass () {} //A static method to get the instance public static EarlyClass getInstance() { return ins; } //A sample method that is protected from more than one object creation public void sampleMethod() { System.out.println("sampleMethod for Early singleton"); } //Main method public static void main(String[] args) { EarlyClass tmp = getInstance(); tmp.sampleMethod(); } }
出力:
上記のプログラムでは、ロード時にインスタンスが作成され、getInstance() メソッドを使用してインスタンスが返されます。さらに、コンストラクターはシングルトンのインスタンス化の一部としてプライベートとして設定されます。
オブジェクトが何度も作成されずに再利用されるため、これを使用する主な利点はメモリの節約です。
このドキュメントでは、クラス UML 図、アルゴリズム、サンプル コードを使用してシングルトン クラスがどのように機能するかを説明しました。シングルトン クラスは、クラスにオブジェクトが 1 つだけ必要な場合と、そのオブジェクトへのグローバル アクセス ポイントが必要な場合に使用されます。早期インスタンス化と遅延インスタンス化などの 2 つの形式は、要件に基づいて使用できます。
以上がJavaのシングルトンクラスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。