logo

Java のシングルトン メソッド設計パターン

オブジェクト指向プログラミングでは、Java シングルトン クラスは、一度に 1 つのオブジェクト (クラスのインスタンス) のみを持つことができるクラスです。初めて Java シングルトン クラスをインスタンス化しようとすると、新しい変数は作成された最初のインスタンスも指します。したがって、インスタンスを通じてクラス内の変数に加えた変更は、作成された単一インスタンスの変数に影響し、定義されたクラス型の変数を通じてその変数にアクセスした場合に表示されます。

クラスをシングルトン クラスとして定義するとき、つまりシングルトン クラスを設計するときは、次の重要なポイントに注意してください。



  1. コンストラクターをプライベートにします。
  2. このシングルトン クラスの戻り値の型オブジェクトを持つ静的メソッドを作成します。ここでは、遅延初期化の概念を使用してこの静的メソッドを記述します。

シングルトンクラスの目的

Java シングルトン クラスの主な目的は、オブジェクトの作成数の制限を 1 つだけに制限することです。これにより、多くの場合、ソケットやデータベース接続などのリソースへのアクセス制御が確保されます。

シングルトン クラスを使用するとインスタンスの作成が制限されるため、メモリ領域の浪費は発生しません。オブジェクトの作成は、新しいリクエストが行われるたびに作成されるのではなく、一度だけ行われるためです。

この 1 つのオブジェクトを要件に応じて繰り返し使用できます。これが、マルチスレッド アプリケーションやデータベース アプリケーションがキャッシュ、ロギング、スレッド プーリング、構成設定などに Java のシングルトン パターンを主に使用する理由です。



たとえば、ライセンスがあり、データベース接続が 1 つしかない、または JDBC ドライバーでマルチスレッドが許可されていないと仮定すると、Singleton クラスが登場して、一度に 1 つの接続だけが接続できるようにします。または、単一のスレッドが接続にアクセスできます。

Java でシングルトン クラスを設計/作成するにはどうすればよいですか?

シングルトン クラスを作成するには、以下の手順に従う必要があります。

FCF

1. クラスのインスタンスが 1 つだけ存在するようにしてください。



2. そのインスタンスへのグローバル アクセスを提供するには、

  • クラスのすべてのコンストラクターをプライベートであると宣言します。
  • インスタンスへの参照を返す静的メソッドを提供します。遅延初期化の概念は、静的メソッドの作成に使用されます。
  • インスタンスはプライベート静的変数として保存されます。

シングルトンクラスの例は次のとおりです。 ランタイム クラス、アクション サーブレット、およびサービス ロケーター 。プライベート コンストラクターとファクトリ メソッドもシングルトン クラスの例です。

ノーマルクラスとシングルトンクラスの違い

シングルトン クラスは、クラスのオブジェクトをインスタンス化するプロセスに関して通常のクラスと区別できます。通常のクラスをインスタンス化するには、Java コンストラクターを使用します。一方、シングルトン クラスをインスタンス化するには、getInstance() メソッドを使用します。

もう 1 つの違いは、通常のクラスはアプリケーションのライフサイクルの終了時に消滅するのに対し、シングルトン クラスはアプリケーションの完了時に破壊されないことです。

シングルトン クラス パターンの形式

シングルトン設計パターンには次の 2 つの形式があります。

  • 初期のインスタンス化: オブジェクトの作成はロード時に行われます。
  • 遅延インスタンス化: オブジェクトの作成は要件に従って行われます。

実装: シングルトン クラスが Java の通常のクラスとどのように異なるかを簡単に説明します。ここでの違いは、通常のクラスではコンストラクターを使用するのに対し、シングルトン クラスでは getInstance() メソッド これについては、以下に示す例 1 で確認します。一般に、混乱を避けるために、このメソッドを定義する際にクラス名をメソッド名として使用することもできます。これについては、以下の例 2 で説明します。

例 1:

ジャワ




// Java program implementing Singleton class> // with using getInstance() method> // Class 1> // Helper class> class> Singleton {> >// Static variable reference of single_instance> >// of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor> >// Here we will be creating private constructor> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Static method> >// Static method to create instance of Singleton class> >public> static> synchronized> Singleton getInstance()> >{> >if> (single_instance ==>null>)> >single_instance =>new> Singleton();> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.getInstance();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.getInstance();> >// Instantiating Singleton class with variable z> >Singleton z = Singleton.getInstance();> >// Printing the hash code for above variable as> >// declared> >System.out.println(>'Hashcode of x is '> >+ x.hashCode());> >System.out.println(>'Hashcode of y is '> >+ y.hashCode());> >System.out.println(>'Hashcode of z is '> >+ z.hashCode());> >// Condition check> >if> (x == y && y == z) {> >// Print statement> >System.out.println(> >'Three objects point to the same memory location on the heap i.e, to the same object'>);> >}> >else> {> >// Print statement> >System.out.println(> >'Three objects DO NOT point to the same memory location on the heap'>);> >}> >}> }>

Linuxコマンドのディレクトリ
>

>

出力

Hashcode of x is 558638686 Hashcode of y is 558638686 Hashcode of z is 558638686 Three objects point to the same memory location on the heap i.e, to the same object>

出力の説明:

シングルトンクラス

シングルトン クラスで、初めて呼び出したとき、 getInstance() メソッド 、single_instance という名前のクラスのオブジェクトを作成し、それを変数に返します。 single_instance は静的であるため、null から何らかのオブジェクトに変更されます。次に、single_instance が null ではないため getInstance() メソッドを呼び出そうとすると、Singleton クラスを再度インスタンス化するのではなく、変数に返されます。この部分は if 条件によって実行されます。

メインクラスでは、静的メソッドを呼び出して、3 つのオブジェクト x、y、z でシングルトン クラスをインスタンス化します。 メソッド getInstance() 。しかし実際には、図に示すように、オブジェクト x の作成後、変数 y と z はオブジェクト x を指します。したがって、オブジェクト x の変数を変更すると、それはオブジェクト y と z の変数にアクセスするときに反映されます。また、オブジェクト z の変数を変更すると、オブジェクト x と y の変数にアクセスしたときにそれが反映されます。

ubuntu ビルドの必需品

これで例 1 のすべての側面のカバーが完了し、同じものを実装しました。次に、クラス名と同じメソッド名を使用して Singleton クラスを実装します。

例 2:

ジャワ


ミア・ハリファの年齢



// Java program implementing Singleton class> // with method name as that of class> // Class 1> // Helper class> class> Singleton {> >// Static variable single_instance of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor of this class> >// Here private constructor is used to> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Method> >// Static method to create instance of Singleton class> >public> static> Singleton Singleton()> >{> >// To ensure only one instance is created> >if> (single_instance ==>null>) {> >single_instance =>new> Singleton();> >}> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.Singleton();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.Singleton();> >// instantiating Singleton class with variable z> >Singleton z = Singleton.Singleton();> >// Now changing variable of instance x> >// via toUpperCase() method> >x.s = (x.s).toUpperCase();> >// Print and display commands> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >System.out.println(>' '>);> >// Now again changing variable of instance z> >z.s = (z.s).toLowerCase();> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >}> }>

>

>

出力

String from x is HELLO I AM A STRING PART OF SINGLETON CLASS String from y is HELLO I AM A STRING PART OF SINGLETON CLASS String from z is HELLO I AM A STRING PART OF SINGLETON CLASS String from x is hello i am a string part of singleton class String from y is hello i am a string part of singleton class String from z is hello i am a string part of singleton class>

説明: シングルトン クラスでは、初めて Singleton() メソッドを呼び出すと、single_instance という名前の Singleton クラスのオブジェクトが作成され、それが変数に返されます。 single_instance は静的であるため、null から何らかのオブジェクトに変更されます。次回、Singleton() メソッドを呼び出そうとすると、single_instance が null ではないため、Singleton クラスを再度インスタンス化するのではなく、変数に返されます。

さらに読む: Java デザイン パターンのチュートリアル