クリエイティブデザインパターン:1。シングルトンパターン

作成デザインパターンとは何ですか?

(2020年12月26日)

作成デザインパターンは、クラスの新しいオブジェクトの作成またはクローン作成を扱います。複製は、同様の種類のオブジェクトがすでに存在し、新しいオブジェクトをインスタンス化する代わりに、既存のオブジェクトを複製する場合に発生します。

オブジェクトを作成するさまざまな方法は、問題の解決方法に大きく影響します。したがって、言語が異なれば、使用できるパターンに影響します。

シングルトンパターン

クラスのインスタンスが1つだけ必要な場合は、シングルトンパターンが使用されます。たとえば、アプリケーションでDB接続を確立し、多くのリソースを必要とするロガーを使用して、プリンターのキューを印刷します。これらすべての場合において、複数のインスタンスがあると、混乱と不整合が発生します。

このパターンは、インスタンスがアプリケーション全体で共有され、グローバルにアクセスできる場合に使用されます。共有リソースへのアクセスがスレッドセーフであることを確認することは、この種のパターンが不可欠な場合の非常に良い例の1つです。シングルトンパターンの目的は、1つのインスタンスに制限されているクラスへのグローバルアクセスを提供することです。

オブジェクトがどのように作成されるかを見てみましょう

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

これで、DummyClassのオブジェクトが必要になるたびに、そのコンストラクターが呼び出され、オブジェクトが作成されます。これはEager初期化と呼ばれます。

ただし、シングルトンパターンでは、クラスの単一インスタンスのみが必要です。たとえば、DB接続がすでに設定されている場合は、新しいDB接続を作成する必要はなく、既存の接続を使用する必要があります。それを実現する方法を見てみましょう。

ここでは、コンストラクターのスコープをクラス自体に限定しています。したがって、このクラスのオブジェクトを作成するには、クラスのgetDBConnection()静的メソッドを呼び出す必要があります。次に、dbConnectionオブジェクトがnullかどうかを確認してから、新しい接続オブジェクトを作成し、それ以外の場合は既存の接続オブジェクトを返します。

この例は、遅延初期化。つまり、本当に必要な場合を除いて、クラスのオブジェクトを作成することはありません。したがって、このプログラムはリソースの点でより効率的です。

シングルトン設計の原則にはトレードオフがあります。複数のコンピューティングスレッドが実行されている場合、共有された単一のオブジェクトにアクセスしようとするスレッドが原因で問題が発生する可能性があります。

上記の実装の問題

現在、2つの可能性があります。同時にスレッドはgetDBConnectionメソッドを呼び出しており、オブジェクトはまだ作成されていません。両方のスレッドで、dbConnectionオブジェクトはnullになり、両方とも新しいインスタンスを作成して、代わりにそれを使用しようとします。したがって、複数のインスタンスが作成されないように、単一のスレッドが一度にgetDBConnectionにアクセスできることを確認することが非常に重要です。

スレッドを実現するには-safe シングルトンクラスは、グローバルアクセスメソッドを同期させて、一度に1つのスレッドのみがこのメソッドを実行できるようにします。

この同期されたコードブロックに一度にアクセスできるのは1つのスレッドのみです

あなたは問題が今解決されたと思っているかもしれません。しかし、残念ながら違います!シングルトンプロパティを適用するために、静的getDBConnectionメソッドをロックしますが、同時にそのパフォーマンスを低下させます。オブジェクトがすでに作成されている場合も、複数のスレッドがそのオブジェクトの既存のインスタンスを取得するのを待つ必要があります。もっと良いことができますか?見てみましょう。

明らかなように、ロックはインスタンスがnullの場合にのみ必要であり、異なるスレッドが複数のインスタンスを作成しないようにします。したがって、インスタンスがnullかどうかをチェックするif条件内に同期条件を配置し、複数のインスタンスのシナリオを排除するためにダブルチェックを追加できます。

実際の使用では、シングルトンパターンはさまざまな方法で実装できます。これは、このパターンが提供する基本的な目的を定義するだけですが、コードの実装は異なる場合があります。

それはすべて私の側からです。シングルトンデザインパターンをどこで、いつ、どのように使用するかが明確になったことを願っています。詳細については、Gang ofFourのデザインパターンカタログを参照してください。

疑問がある場合は、以下のコメントでお知らせください。このブログが気に入ったら、友達と共有してください。ハッピーソフトウェアエンジニアリング!

パート2: