さまざまな設計パターンの長所と短所

単純なファクトリパターン

単純なファクトリパターンは、ファクトリクラスにすべてのオブジェクトを作成する責任を負わせることです。発信者が必要とする製品は、工場で製造してください。

利点:構築プロセスをカプセル化することの利点は、製品の構築方法が非常に複雑な場合、結合を減らすだけでなく、ファクトリモデルを使用することでコードの重複を大幅に減らすことができます。

短所:最初に、生産する必要のある製品が多すぎる場合、このモードでは、ファクトリークラスが大きくなりすぎ、責任が多すぎてスーパークラスになります。

2つ目は、新しい製品が生成されたときに、新しいブランチをファクトリクラスに追加する必要があることです。これは開閉の原則に違反しています

ファクトリーメソッドパターン

ファクトリー・メソッド・パターンは、単純なファクトリーのさまざまな責任を、専門的な責任のファクトリー・クラスに分割することです。

利点:ファクトリーメソッドモデルは、単純な共プラントモデルの欠点を解決するために生まれました。生産される製品のタイプが増えると、ファクトリークラスはスーパークラスになりません(各ファクトリーの操作プロセスは個別に変更できます)。新しい製品を生産する必要がある場合、既存のファクトリーを変更する必要はなく、新しいものを追加するだけです。工場は元気です。開閉の原則に沿った、オブジェクト指向のスケーラビリティの維持。

短所:単純なファクトリーと比較して、ファクトリーメソッドにはより多くのユーザー操作クラスがあり、ユーザー側のコード量が増加しますが、その改善の程度と比較すると、この問題はまだ許容可能です。

抽象的なファクトリパターン

ファクトリー・インターフェースを抽出してファクトリー・パターンを抽象化する際のファクトリー・メソッド・パターンのさらなる改善

利点:クライアントは抽象ファクトリのメソッドのみを呼び出すため(各具象ファクトリはそのメソッドを実装しますが、クライアントの呼び出しコードは同じです)、これによりファクトリの置き換えが非常に簡単になります。また、ファクトリメソッドモデルの利点を継承し、開閉の原理と依存関係の逆転の原理を十分に発揮します。

短所:抽象ファクトリモデルが重すぎる抽象インターフェースが新しい関数を追加する必要がある場合、すべての具象ファクトリクラスに影響します。すべての工場モデルは、同様の工場の水平拡張要件に適していますが、新しい機能の追加などの垂直拡張には適していません。

シングルトンモード

シングルトンモードでは、クラスの作成時にクラスが独自のインスタンスを作成できるようにします(初期化関数はクラスで提供されます)。

シングルトンモードには、レイジーマンモードとハングリーマンモードの2つがあります。レイジーマンモードは、クラスに初期化関数を提供します(初期化されていない場合はクラスを初期化し、クラスが初期化されている場合は呼び出しを終了します)。この初期化関数はローカルで呼び出されます。ハングリーマンモードは、クラスの変数が作成されたときに宣言し、変数を返す宣言関数を提供します。特定のプロセスとさまざまな長所と短所は私のブログ()を参照してください。

ビルダーモード

ビルダーモードはジェネレーターモードとも呼ばれ、複雑なオブジェクトの構築をその表現から分離するため、同じ構築プロセスで異なる表現を作成できます。

実装

ディレクターはオンデマンドでクライアントと直接通信します。

連絡後、司令官は、製品を作成するという顧客の要求を各コンポーネントの構築要求(ビルダー)に分割します。

各コンポーネントの構築リクエストを具象ビルダー(ConcreteBuilder)に委任します。

特定の各ビルダーは、製品コンポーネントの構築を担当します。

最後に、特定の製品(製品)に組み込みます。

利点

1.ビルダーモードを使用すると、クライアントは製品の内部構成の詳細を知る必要がなくなります。

2.特定のビルダークラスは互いに独立しているため、システムの拡張に役立ちます。

3.特定のビルダーは互いに独立しているため、他のモジュールに影響を与えることなく、構築プロセスを徐々に洗練することができます。

不利益

1.ビルダーモードで作成された製品は一般に共通性が高く、コンポーネントは類似しています。製品間に大きな違いがある場合、ビルダーモードの使用は適切ではないため、その使用範囲には特定の制限が適用されます。

2.製品の内部変更が複雑な場合、この変更を実現するために多くの特定のビルダークラスを定義する必要が生じ、システムが非常に大きくなる可能性があります。

プロトタイプモード

プロトタイプモードでは、プロトタイプインスタンスを使用して作成するオブジェクトのタイプを指定し、これらのプロトタイプをコピーして新しいオブジェクトを作成します。実際、作成の詳細を知らなくても、1つのオブジェクトから別のカスタマイズ可能なオブジェクトを作成します。

利点:

プロトタイプモードを使用してオブジェクトを作成すると、オブジェクトを直接作成するよりもパフォーマンスが大幅に向上します。Objectクラスのcloneメソッドは、特に大きなオブジェクトをコピーする場合、メモリ内のバイナリストリームを直接操作するローカルメソッドであるため、パフォーマンスの違いは非常に明白です。

プロトタイプモードを使用するもう1つの利点は、オブジェクトの作成を簡略化して、ドキュメントの編集時にオブジェクトを簡単にコピーして貼り付けることができることです。

アダプターモード

あるクラスのインターフェースを顧客が望む別のインターフェースに変換します。これにより、互換性のないインターフェースのために機能しないクラスが連携して機能できるようになります。

利点:

既存のクラスが再利用され、既存のクラスと再利用環境の要件の不整合の問題が解決されます。

オブジェクトアダプターは、複数の異なるアダプタークラスを同じターゲットに適合させることができます。つまり、同じアダプターがアダプタークラスとそのサブクラスの両方をターゲットインターフェイスに適合させることができます。

短所:

オブジェクトアダプターの場合、アダプターを置き換える実装プロセスはより複雑です。

ブリッジモード

抽象部分を実際の部分から分離して、すべて独立して変更できるようにします(実現システムには分類の複数の角度があり、各カテゴリが変更される可能性があります。次に、このマルチ角度を分離して、それらを個別に変更できるようにします。それらの間の結合)

ブリッジモードの使用シナリオ:
1.オブジェクトに複数の変更要素がある場合、これらの変更要素を抽象化することにより、具体的な実現に依存し、抽象化に依存するように変更されます。
2.特定の変更要因が複数のオブジェクト間で共有されている場合。この変化要因を抽象化して、これらの異なる変化要因を認識できます。
3.オブジェクトの複数の変更要素が、クライアントのプログラムの使用に影響を与えずに動的に変化することが予想される場合。

組み合わせモード

オブジェクトをツリー構造に結合して、「部分全体」の階層を表します。複合モードでは、シングルユーザーオブジェクトと複合オブジェクトの使用に一貫性があります。

短所:クライアントは、クラス間の階層関係を明確にするためにより多くの時間を費やす必要があります

利点:コンテナー間の分離を実現するために、リレーショナル処理を必要としない単一のオブジェクト、または結合されたオブジェクトコンテナー。新しいパーツがある場合は簡単に追加できます。

コンビネーションモードを使用する場合:

要件が部分的および全体的な階層構造を反映している場合、およびユーザーが結合オブジェクトと単一オブジェクトの違いを無視し、結合構造内のすべてのオブジェクトを均一に使用する場合。

中間モデル

中間オブジェクトを使用して、一連のオブジェクトの相互作用をカプセル化します。仲介者は明示的に各オブジェクトを相互に参照させないため、疎結合になり、オブジェクト間の相互作用を個別に変更できます。

利点:

多対多の通信を多対1の通信に変換し、システムの複雑さを軽減します。メディエーターには、システムを分離するという特徴があります。集中制御

短所:

制御の集中化により、インタラクションの複雑さが仲介者の複雑性になり、これにより仲介者はどのコンクリート同僚よりも複雑になります

メモモード

カプセル化を破棄せずにオブジェクトの内部状態をキャプチャし、オブジェクトの外部でこの状態を維持します。このようにして、オブジェクトを元の状態に復元できます。

メモモードを使用する利点:
1)一部のイニシエーターオブジェクトの内部情報は、イニシエーターオブジェクトの外部に保存する必要がある場合がありますが、イニシエーターオブジェクトで読み取る必要があります。このとき、メモモードを使用すると、イニシエーターの複雑な内部情報を保存できます。他のオブジェクトをシールドして、パッケージの境界を適切に維持できるようにします。
2)このモードは、人間の開始を単純化します。イニシエーターは内部状態の個々のバージョンを管理および保存する必要がなくなり、クライアントは必要な状態のバージョンを自分で管理できます。
3)イニシエーターの役割の状態が変化した場合、状態が無効になることがありますが、このとき一時保存したメモを利用して状態を復元できます。

メモモードを使用するデメリット:
1)イニシエーターロールのステータスをメモオブジェクトに完全に格納する必要がある場合、メモオブジェクトはリソース消費の点で高価になります。
2)担当者ロールがメモを保存する場合、担当者はこの状態がどれだけの記憶容量を占めるか分からないため、操作が高価かどうかをユーザーに思い出させることができない。

状態モード

オブジェクトの内部状態がその動作を変更できる場合、オブジェクトはクラスを変更したように見えます。

利点:

特定の状態関連の動作をオブジェクトに配置します。すべての状態関連のコードは特定のConcreteStateに存在するため、新しいサブクラスを定義することで、新しい状態と遷移を簡単に追加できます。

戦略モード

アルゴリズムのファミリーを定義し、それらを個別にカプセル化して、それらを相互に置き換えられるようにします。サブモードでは、アルゴリズムを変更しても、アルゴリズムを使用する顧客に影響を与えません。

利点:

戦略モードは「開閉の原則」に完全に準拠しており、ユーザーは元のシステムを変更せずにアルゴリズムや動作を選択したり、新しいアルゴリズムや動作を柔軟に追加したりできます。

短所:

戦略モードはアルゴリズムを定義しますが、アルゴリズムの選択は提供しません。つまり、どのアルゴリズムが戦略モードに関係のない問題に最適であるかを判断するため、戦略の選択はクライアントが行う必要があります。クライアントは、各アルゴリズムの違いと、どの戦略をいつどこで使用するのが最も適切であるかを明確に把握している必要があります。

テンプレート方式

アルゴリズムのスケルトンを定義し、サブクラスへのいくつかのステップを遅らせます。テンプレートメソッドを使用すると、サブクラスはアルゴリズムの構造を変更せずに、アルゴリズムの特定のステップを再定義できます。

利点:

不変の動作をスーパークラスに移動し、サブクラスの重複コードを削除することにより、その利点を反映し、優れたコード再利用プラットフォームを提供します

訪問者モード

特定のオブジェクト構造の要素に作用する操作により、各要素のクラスを変更せずにこれらの要素に作用する新しい操作を定義できます。

利点:

データ構造は構造の操作から切り離されているため、操作のセットは比較的自由に展開できます。

短所:

新しいデータ構造を追加することを困難にします

(比較的安定したデータ構造を持つシステムに適用可能)

おすすめ

転載: blog.csdn.net/weixin_43244265/article/details/108569105