定義:抽象的な工場パターンは、具体的なクラスを指定することなく、関連するオブジェクトまたは従属オブジェクトのファミリを作成するためのインターフェイスを提供します。このパターンは、システムが製品の作成、構成、および表現方法とは独立している必要がある場合に特に役立ちます。
使用の例:さまざまな環境(陸、海、空気)を表すことができるシミュレーションソフトウェアの開発を想像してください。抽象的な工場パターンを使用して、さまざまな種類の動物や植物を作成して、各環境に異なる具体的な工場を実装して、その環境に固有のオブジェクトを作成する方法を知る方法を使用して工場インターフェイスを定義できます。
定義:ファクトリーメソッドパターンは、オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがインスタンス化するクラスを決定できるようにします。このパターンは、オブジェクトのインスタンス化の責任をサブクラスに委任し、ゆるい結合を促進します。
使用法の例:ドキュメント管理アプリケーションは、工場の方法を使用して、さまざまな種類のドキュメント(テキスト、チャート、プレゼンテーション)を作成できます。各タイプのドキュメントには具体的なクラスがあり、基本クラスの工場メソッドは、ユーザー入力に基づいて作成するドキュメントを決定し、具体的なドキュメントクラスからクライアントコードを分離します。
定義:ビルダーパターンは、複雑なオブジェクトの構造を表現から分離し、異なる表現に対して同じ構造を可能にします。このパターンは、オブジェクトを複数のステップで作成する必要がある場合に役立ち、構造プロセスは異なる表現に対して同じである必要があります。
使用の例:さまざまな種類の車(スポーツ、SUV、コンバーチブル)を作成できる車の建設業者を検討してください。ビルダーを使用して、これらの車の建設プロセスは、さまざまな階段(シェーシー、エンジン、インテリアの建設)に標準化できますが、各車の種類の特定の詳細は異なるコンクリートビルダーを介して処理されます。
定義:責任チェーンパターンにより、ハンドラーのチェーンに沿って要求を渡すことができます。各ハンドラーは、リクエストを処理するか、チェーンの次のハンドラーに渡すかを決定します。
使用方法:ヘルプデスクシステムでは、サポートリクエストがさまざまなレベルのテクニカルサポートを通過する場合があります。各レベルはリクエストを調べ、それを処理できるか、次のレベルに渡すことができるかを決定します。これにより、リクエスト送信者が特定の受信機と結合することを回避し、異なるオブジェクト間で責任を分配します。
定義:コマンドパターンは、リクエストを、アクションを実行するために必要なすべての情報を含む独立したオブジェクトに変換します。これにより、さまざまなリクエストを使用したパラメーター化メソッド、リクエストの実行の遅延または並べ、元に戻す操作のサポートが可能になります。
使用方法:ホームオートメーションアプリケーションでは、ライトのオン/オフライトやサーモスタットの調整などのコマンドをコマンドオブジェクトにカプセル化できます。これらのコマンドは、スマートフォンやタブレットなどのさまざまなデバイスで送信でき、必要に応じてスケジュールまたは元に戻すことができます。
定義:プロトタイプパターンにより、コードをクラスに依存せずに既存のオブジェクトをコピーすることができます。プロトタイプの各クラスは、プロトタイプインターフェイスを実装し、それ自体をクローン化する方法を提供します。
使用法の例:ゲームでは、シーンで毎回オブジェクトをゼロから作成する代わりに、「プロトタイプ」オブジェクトをクローン化して同一のコピーを作成できます。これは、多くの類似のオブジェクトを作成および破壊するゲームのシナリオで特に役立ちます。
定義: Mementoパターンにより、内部実装の詳細を明らかにすることなく、オブジェクトの以前の状態を保存および復元できます。このパターンは、以前の状態に戻す能力を必要とするアプリケーションで元に戻すなどの機能を実装するのに役立ちます。
使用の例:ユーザーがテキストの変更を元に戻すことができるテキストエディターを開発することを想像してください。重要な編集が行われるたびに、編集者の状態はメメントオブジェクトに保存されます。ユーザーが変更を取り消すことを希望する場合、編集者はこれらの記念オブジェクトの1つから状態を復元し、テキストを以前の状態に戻すことができます。
定義:メディエーターパターンは、接続されたオブジェクト間の複雑な通信と依存関係を集中化するオブジェクトを定義し、ゆるいカップリングを促進し、オブジェクトが互いに直接参照するのを防ぎます。これにより、複雑な相互作用のより良い処理が可能になり、コードの保守性が向上します。
使用の例:航空交通管制アプリケーションを検討してください。各航空機が他のすべての航空機(非常に複雑なシステムを作成する)と直接通信できるようにする代わりに、メディエーター(この場合はコントロールタワー)がすべての通信を処理します。航空機は、いつ、どこに着陸するかなど、各航空機のアクションを指示する制御塔とのみ通信します。
定義:テンプレートメソッドパターンは、メソッドのアルゴリズムのスケルトンを定義し、サブクラスによって実行されるいくつかの手順を延期します。これにより、アルゴリズムの構造を変更せずにアルゴリズムの特定のステップを再定義できます。
使用の例:自動テストフレームワークを考えてください。テンプレートメソッドを使用して、テンプレートメソッドがテスト実行フロー(セットアップ、実行、クリーンアップ)を確立する標準テスト構造を定義できます。特定のテストサブクラスは、テスト後にセットアップ、実際のテスト実行、クリーンアップ操作の方法を実装することにより、各ステップをカスタマイズできます。
定義:オブザーバーパターンは、オブジェクト間の1対多くの関係を確立し、1つのオブジェクトが状態を変更すると、その依存者がすべて通知され、自動的に更新されます。このパターンは、分散イベント通知システムの実装に特に役立ちます。このパターンでは、1つの状態への変更は、他のシステムまたはコンポーネントでリアルタイムに反映される必要があります。
使用例:スマートビルの気候管理システムを検討してください。温度センサー(パブリッシャー)は環境を継続的に監視し、大幅な変化の場合は、最適な温度を維持するために適応するように調整するエアコンや暖房システムなど、さまざまなデバイス(オブザーバー)に更新を送信します。これにより、気候制御システムは、直接的な人間の介入なしに環境条件に動的に反応し、快適さとエネルギー効率を確保できます。
定義:状態パターンにより、オブジェクトは内部状態が変更されたときに動作を変更できます。オブジェクトがクラスを変更しているように見えます。このパターンは、複雑な状態の変化の状況を処理するのに役立ち、コード内の分岐条件(IF-ELSEまたはスイッチ)の必要性を減らします。
使用法:オンライン注文のライフサイクルを管理するためのアプリケーションを開発することを想像してください。注文は、「処理」、「出荷」、「配信」などのさまざまな状態で行うことができます。状態パターンを使用して、Process()、Ship()、DEREMING()などの方法で抽象的なOrderStateクラスを定義できます。各コンクリート状態(例:ProcessState、SimpiptState、配信ステート)は、これらの方法を実装して、状態遷移を適切に処理します。コンテキスト(例:Orderクラス)は、現在の状態への参照を維持し、状態操作を具体的な状態オブジェクトに委任するため、クライアントコードからの直接的な介入なしに、現在の状態に基づいて注文の動作が変更されるようにします。
定義:戦略パターンは、アルゴリズムのファミリーを定義し、専用のクラスでそれらをカプセル化し、そのコンテキスト内でオブジェクトを交換可能にすることを可能にする行動パターンです。このアプローチにより、クライアントを使用することとは独立して、さまざまなアルゴリズムが可能になります。
使用の例:顧客の国に応じて、異なる税計算戦略を実装する必要があるeコマースアプリケーションを想像してください。戦略パターンを使用すると、CalculateTax()メソッドを使用してTaxstrategyインターフェイスを定義し、USTAXStrategy、EutaxStrategy、AsiataxStrategyなどのさまざまな税務コンテキストにさまざまな具体戦略を実装できます。
定義: Iteratorパターンは、基礎となる表現を公開することなく、シーケンシャル集約オブジェクトの要素にアクセスする方法を提供します。このパターンは、コレクションのさまざまなトラバーサルモードの管理に特に役立ちます。
使用法:ツリーやグラフなどのデータのコレクションを検討してください。 Iteratorパターンを使用すると、クライアントコードがさまざまな構造間の違いを処理することなく、これらの複雑なデータ構造の要素への均一なアクセスを提供できます。たとえば、DepthFirstiteratorやBredthFirstiteratorなどの異なる反復器を使用して、グラフをトラバースすることができます。
定義:訪問者パターンにより、アルゴリズムを操作するオブジェクトの構造から分離できます。このパターンは、既存のクラスを変更せずに既存のクラスに新しい操作を追加する方法を提供します。
使用の例:保険のコンテキストで顧客管理システムがあることを想像してください。訪問者パターンにより、オブジェクトは顧客のリストを通過し、保険に関するパーソナライズされたメッセージを送信できます。
定義:アダプターパターンを使用すると、互換性のないインターフェイスを連携させることができます。既存のクラスのインターフェイスをクライアントが期待する別のインターフェイスに変換することにより、2つの互換性のないインターフェイス間のブリッジとして機能します。
使用の例:チャートをレンダリングするための新しいインターフェイスがあると仮定しますが、既存のライブラリは異なるインターフェイスで同様の機能を提供します。既存のライブラリを書き換える代わりに、アダプターを使用して、既存のライブラリを新しいレンダリングインターフェイスで動作させるため、シームレスな統合を可能にします。
定義:ブリッジパターンは、抽象化とその実装を分離する構造パターンであり、独立して変化させることができます。これは、大規模なクラスまたは密接に関連するクラスのセットを、独立して開発および修正できる2つの別々の階層(抽象化と実装)に分割するために使用されます。
使用の例:ピザ配達アプリケーションでは、それぞれがユニークな味を持つさまざまな種類のピザがあり、さまざまな調理スタイルを持つさまざまな種類のレストランがあります。ピザの注文が配置されると、アプリケーションはブリッジパターンを使用して、ピザが顧客の好みに応じて作曲され、選択したレストランの特定のスタイルに従って調理されます。これにより、ブリッジパターンは、さまざまな種類のピザとレストランのさまざまな調理スタイルの統合を促進し、効率的でパーソナライズされた配信を可能にします。
定義:複合パターンは、オブジェクトと個々のオブジェクトのグループを均一に処理できる構造パターンです。このパターンは、オブジェクトをツリー構造に整理して、部分的な階層を表します。これにより、ユーザーは個々のオブジェクトとオブジェクトの構成を均一に動作させることができます。
使用方法:個々のアイテムやその他のボックスを含むギフトボックス管理システムがあると想像してください。クライアントはメインボックスを作成し、本やビデオゲームなどのアイテムと、本を含む小さなボックスを追加します。メインボックス内のすべてのアイテムの合計価格が計算されます。複合パターンにより、個々のオブジェクトとオブジェクトの構成を同じように扱い、コードを簡素化し、個々のオブジェクトとオブジェクトのグループの両方で操作を均一にすることができます。
定義:デコレーターパターンは、継承を通じて構造を変更せずにオブジェクトに追加の責任を追加することを可能にする構造パターンです。このパターンは、機能を拡張するために拡張クラスを導き出すための柔軟な代替手段を提供します。
使用方法:通知システムがあることを想像してください。デコレーターパターンにより、さまざまなソーシャルプラットフォームの機能を拡張できます。このようにして、通知は、コードを直接変更することなく、さまざまなチャネルを介して送信できます。
定義:ファサードパターンは、サブシステム内の一連のインターフェイスに統一されたインターフェイスを提供する構造パターンです。このパターンは、サブシステムを使いやすくする高レベルのインターフェイスを定義します。
使用の例:車のマルチメディアデバイスを管理するための複雑なシステムを検討してください。これには、オーディオ、ビデオ、Bluetooth接続用のサブシステムが含まれます。ファサードは、音楽を起動したり、ビデオを停止したり、通話を管理したり、サブシステム間の複雑さと依存関係を隠したりする簡単なインターフェイスを提供できます。
定義:フライ級パターンは、共有を使用して、多数の細かいオブジェクトを効率的にサポートする構造パターンです。オブジェクトの状態の大部分を共有して外部にすることができる場合に特に役立ちます。
使用の例:本の種類を管理するためのアプリケーションがあることを想像してください。工場を使用して、本の種類のインスタンスを作成して共有します。これにより、同じタイプの本が複数回リクエストされている場合、毎回新しいオブジェクトを作成する代わりに同じオブジェクトが返されます。これにより、メモリが保存され、アプリケーションの全体的なパフォーマンスが向上します。
定義:プロキシパターンは、別のオブジェクトがアクセスを制御するための代理またはプレースホルダーを提供します。このパターンは、オブジェクトへのアクセス、怠zyなロード、または分散環境内のオブジェクトの透明なローカリゼーションを提供することに制限を課したい場合に使用されます。
使用方法:ファイルシステムへのアクセス制御では、プロキシを使用してファイル上のユーザー操作を制御できます。プロキシは、ファイルへの実際のアクセスを許可する前に、ユーザーの資格情報を検証し、追加のセキュリティを提供します。
定義: Singletonパターンは、クラスに1つのインスタンスしかないことを保証しながら、このインスタンスにグローバルなアクセスポイントを提供する作成パターンです。
使用方法:アプリケーションでは、Singletonパターンを使用してアプリケーションの構成を管理できます。 Singletonオブジェクトには、アプリケーションの実行中に一定のままで、プログラムのさまざまな部分から読み取ることができるすべての構成を含めることができます。