紹介
ソフトウェアエンジニアリングでは、デザインパターンは、ソフトウェアで最も一般的に遭遇する問題に対する確立されたソリューションを表します設計。これは、経験豊富なソフトウェア開発者による試行錯誤を通じて長期間にわたって進化したベストプラクティスを表しています。
デザインパターンは、1994年にErich Gammaによって出版された「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」の後に人気を博しました。 、John Vlissides、Ralph Johnson、Richard Helm(Gang of FourまたはGoFとも呼ばれます)。
この記事では、創造的なデザインパターンとそのタイプについて説明します。また、いくつかを見ていきます。サンプルをコーディングし、これらのパターンが私たちのデザインに適合する状況について話し合います。
創造的なデザインパターン
創造的なデザインパターンは、オブジェクトの作成方法に関係しています。 。制御された方法でオブジェクトを作成することにより、複雑さと不安定さを軽減します。
新しい演算子は、アプリケーション全体にオブジェクトを分散させるため、有害であると見なされることがよくあります。クラスが緊密に結合されるため、時間の経過とともに実装の変更が困難になる可能性があります。
作成デザインパターンは、クライアントを実際の初期化プロセスから完全に分離することでこの問題に対処します。
この記事、4種類の作成デザインパターンについて説明します。
- シングルトン–アプリケーション全体でオブジェクトのインスタンスが最大で1つだけ存在することを保証します
- ファクトリメソッド–のオブジェクトを作成します作成するオブジェクトを正確に指定せずに、いくつかの関連クラス
- Abstract Factory –関連する依存オブジェクトのファミリーを作成します
- Builder –ステップバイステップのアプローチを使用して複雑なオブジェクトを構築します
次に、これらの各パターンについて詳しく説明します。
シングルトンデザインパターン
シングルトンデザインパターンは、オブジェクトのインスタンスがJava仮想マシン全体に1つだけ存在することを確認することにより、特定のクラスのオブジェクトの初期化をチェックします。
シングルトンクラスは、オブジェクトへの1つの一意のグローバルアクセスポイントも提供するため、アクセスポイントへの後続の各呼び出しは、その特定のオブジェクトのみを返します。
3.1。シングルトンパターンの例
シングルトンパターンはGoFによって導入されましたが、元の実装はマルチスレッドシナリオで問題があることがわかっています。
ここでは、「静的内部クラスを利用するより最適なアプローチに従います。
ここでは、シングルトンクラスのインスタンスを保持する静的内部クラスを作成しました。誰かがgetInstance()メソッドを呼び出したときにのみインスタンスを作成し、外部クラスがロードされたときは作成しません。
これは、同期を必要とせず、スレッドセーフであるため、シングルトンクラスで広く使用されているアプローチです。 、遅延初期化を強制し、ボイラープレートが比較的少なくなります。
また、コンストラクターにはプライベートアクセス修飾子があることに注意してください。パブリックコンストラクタは誰でもシングルトンにアクセスして新しいインスタンスの作成を開始できることを意味するため、これはシングルトンを作成するための要件です。
これは元のGoF実装ではないことに注意してください。元のバージョンについては、こちらをご覧ください。 Javaでのシングルトンに関するリンクされたBaeldungの記事。
3.2。シングルトンデザインパターンを使用する場合
- 作成に費用がかかるリソース(データベースなど)接続オブジェクト)
- すべてのロガーをシングルトンとして保持してパフォーマンスを向上させることをお勧めします
- アプリケーションの構成設定へのアクセスを提供するクラス
- 次のクラス共有モードでアクセスされるリソースが含まれています
ファクトリメソッドデザインパターン
ファクトリデザインパターンまたはファクトリメソッドデザインパターンは、 Javaで最もよく使用されるデザインパターン。
GoFによると、このパターンは「オブジェクトを作成するためのインターフェイスを定義しますが、インスタンス化するクラスをサブクラスに決定させます。 tiate。 Factoryメソッドを使用すると、クラスはインスタンス化をサブクラスに延期できます。」
このパターンは、仮想コンストラクターのタイプを作成することにより、クライアントから特定のファクトリクラスにクラスを初期化する責任を委任します。
これを実現するために、実際の実装の詳細を隠して、オブジェクトを提供するファクトリに依存しています。作成されたオブジェクトには、共通のインターフェースを使用してアクセスします。
4.1。ファクトリメソッドデザインパターンの例
この例では、いくつかの具体的なクラスによって実装されるPolygonインターフェイスを作成します。PolygonFactoryは、このファミリからオブジェクトをフェッチするために使用されます。 :
最初にポリゴンインターフェイスを作成しましょう:
次に、このインターフェイスを実装し、ポリゴンタイプのオブジェクトを返すSquare、Triangleなどのいくつかの実装を作成します。
これで、辺の数を引数として取り、このインターフェイスの適切な実装を返すファクトリを作成できます。
クライアントがこのファクトリに依存して提供する方法に注意してください。オブジェクトを直接初期化する必要のない適切なポリゴン。
4.2。ファクトリメソッドデザインパターンを使用する場合
- インターフェイスまたは抽象クラスの実装が頻繁に変更されると予想される場合
- 現在の実装の場合新しい変更に快適に対応できない
- 初期化プロセスが比較的単純で、コンストラクタが必要なパラメータがほんの一握りの場合
抽象ファクトリデザインパターン
前のセクションでは、ファクトリメソッドデザインパターンを使用して、単一のファミリに関連するオブジェクトを作成する方法を説明しました。
対照的に、抽象ファクトリデザインパターンが使用されます。関連オブジェクトまたは依存オブジェクトのファミリーを作成します。工場のファクトリーと呼ばれることもあります。
詳細な説明については、AbstractFactoryチュートリアルをご覧ください。
ビルダーデザインパターン
Builderデザインパターンは、比較的複雑なオブジェクトの構築を処理するために設計された別の作成パターンです。
オブジェクト作成の複雑さが増すと、Builderパターンは別のオブジェクトを使用してインスタンス化プロセスを分離できます。オブジェクト(ビルダー)を使用してオブジェクトを構築します。
このビルダーを使用すると、簡単なステップバイステップのアプローチを使用して、他の多くの同様の表現を作成できます。
6.1。ビルダーパターン例
GoFによって導入された元のビルダーデザインパターンは抽象化に重点を置いており、複雑なオブジェクトを処理する場合に非常に適していますが、デザインは少し複雑です。
Joshua Blochは、彼の著書「Effective Java」で、クリーンで非常に読みやすいビルダーパターンの改良版を紹介しました(これは、流暢なデザイン)そしてクライアントの観点から使いやすい。この例では、そのバージョンについて説明します。
この例には、静的内部クラスとしてビルダーを含むBankAccountという1つのクラスしかありません。
外部オブジェクトがフィールドに直接アクセスすることを望まないため、フィールドのすべてのアクセス修飾子はプライベートとして宣言されていることに注意してください。
コンストラクターもプライベートであるため、ビルダーのみがこれに割り当てられます。クラスはそれにアクセスできます。コンストラクターに設定されたすべてのプロパティは、引数として指定したビルダーオブジェクトから抽出されます。
静的内部クラスでBankAccountBuilderを定義しました:
外部クラスに含まれるのと同じフィールドのセットを宣言したことに注意してください。必須フィールドは内部クラスのコンストラクターへの引数として必須ですが、残りのオプションフィールドはsetterメソッドを使用して指定できます。
この実装は、setterメソッドがビルダーを返すようにすることで流暢な設計アプローチもサポートします。オブジェクト。
最後に、buildメソッドは外部クラスのプライベートコンストラクターを呼び出し、それ自体を引数として渡します。返されたBankAccountは、BankAccountBuilderによって設定されたパラメーターを使用してインスタンス化されます。
動作中のビルダーパターンの簡単な例を見てみましょう:
6.2。 Builderパターンを使用する場合
- オブジェクトの作成に関連するプロセスが非常に複雑で、必須およびオプションのパラメーターが多数ある場合
- コンストラクターパラメータの数が増えると、コンストラクターのリストが大きくなります
- クライアントが構築されたオブジェクトに対して異なる表現を期待する場合
結論
この記事では、Javaでの作成デザインパターンについて学びました。また、シングルトン、ファクトリーメソッド、抽象ファクトリー、ビルダーパターンの4つの異なるタイプ、それらの利点、例、および必要な時期についても説明しました。
いつものように、完全なコードスニペットはGitHubで入手できます。
LearnSpringコースを通じてSpring5とSpringBoot 2を使い始めましょう:
> >コースをチェックしてください