ファクトリメソッドデザインパターン
インテント
- オブジェクトを作成するためのインターフェイスを定義しますが、インスタンス化するクラスはサブクラスに決定させます。ファクトリメソッドを使用すると、クラスをサブクラスに定義できます。
- 「仮想」コンストラクタを定義します。
-
new
演算子は有害と見なされます。
問題
フレームワークは、さまざまなアプリケーションのアーキテクチャモデルを標準化する必要がありますが、個々のアプリケーションが独自のドメインオブジェクトを定義し、インスタンス化を提供できるようにする必要があります。
ディスカッション
ファクトリメソッドはオブジェクトを作成することであり、テンプレートメソッドはアルゴリズムを実装することです。スーパークラスは、すべての標準および一般的な動作を指定し(作成ステップに純粋な仮想「プレースホルダー」を使用)、作成の詳細をクライアントが提供するサブクラスに委任します。
ファクトリメソッドを使用すると、デザインをよりカスタマイズ可能になり、ほんの少しだけです。より複雑。他のデザインパターンでは新しいクラスが必要ですが、ファクトリメソッドでは新しい操作のみが必要です。
オブジェクトを作成する標準的な方法としてファクトリメソッドを使用することがよくありますが、次の場合は必要ありません。インスタンス化されたことがないクラス変更またはインスタンス化は、サブクラスが簡単にオーバーライドできる操作(初期化操作など)で行われます。
ファクトリメソッドはAbstractFactoryに似ていますが、ファミリに重点が置かれていません。
ファクトリメソッドアーキテクチャフレームワークによって日常的に指定され、フレームワークのユーザーによって実装されます。
構造
4つのギャング(下記)で説明されているファクトリメソッドの実装は、抽象ファクトリのそれ。そのため、この章のプレゼンテーションでは、それ以降人気が高まっているアプローチに焦点を当てています。
ますます人気が高まっているファクトリの定義メソッドは次のとおりです。static
タイプのオブジェクトを返すクラスのメソッド。ただし、コンストラクターとは異なり、返される実際のオブジェクトはサブクラスのインスタンスである可能性があります。コンストラクターとは異なり、新しいオブジェクトが作成される代わりに、既存のオブジェクトが再利用される場合があります。コンストラクタとは異なり、ファクトリメソッドは異なるよりわかりやすい名前を持ちます(例:Color.make_RGB_color(float red, float green, float blue)
およびColor.make_HSB_color(float hue, float saturation, float brightness)
クライアントは派生クラスの実装の詳細から完全に切り離されています。多態的な作成が可能になりました。
例
ファクトリメソッドはオブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがインスタンス化するクラスを決定できるようにします。このパターン。プラスチック製の玩具の製造者は、プラスチック成形粉末を加工し、目的の形状の型にプラスチックを注入する。おもちゃのクラス(車、アクションフィギュアなど)は型によって決まります。
チェックリスト
- ポリモーフィズムを実行する継承階層がある場合は、基本クラスで
static
ファクトリメソッドを定義してポリモーフィック作成機能を追加することを検討してください。 - ファクトリメソッドへの引数を設計します。インスタンス化する正しい派生クラスを識別するために必要かつ十分な品質または特性は何ですか?
- オブジェクトを最初から作成するのではなく再利用できるようにする内部「オブジェクトプール」の設計を検討してください。
- 検討してください。すべてのコンストラクターを
private
またはprotected
にします。
ルール
- 抽象ファクトリクラスはファクトリメソッドで実装されることがよくありますが、プロトタイプを使用して実装できます。
- ファクトリメソッドは通常、テンプレートメソッド内で呼び出されます。
- ファクトリメソッド:継承による作成。プロトタイプ:委任による作成。
- 多くの場合、設計はファクトリメソッド(複雑さが少なく、カスタマイズ可能で、サブクラスが急増)を使用して開始し、設計者がより多くの場所を発見すると、AbstractFactory、Prototype、またはBuilder(より柔軟でより複雑)に向かって進化します柔軟性が必要です。
- プロトタイプにはサブクラス化は必要ありませんが、初期化操作が必要です。ファクトリメソッドにはサブクラス化が必要ですが、「初期化が必要です。
- ファクトリメソッドの利点は次のとおりです。同じインスタンスを複数回返すことも、その正確なタイプのオブジェクトではなくサブクラスを返すこともできます。
- ファクトリメソッドの支持者の中には、言語設計の問題として(または失敗すると、スタイルの問題として)推奨するものがあります。 )絶対にすべてのコンストラクターはプライベートまたは保護されている必要があります。クラスが新しいオブジェクトを製造するか、古いオブジェクトをリサイクルするかは、他の誰の仕事でもありません。
-
new
演算子は有害であると見なされました。オブジェクトを要求することとオブジェクトを作成することには違いがあります。new
演算子は常にオブジェクトを作成し、オブジェクトの作成をカプセル化できません。ファクトリメソッドは、そのカプセル化を強制し、作成行為と密接に結びつくことなくオブジェクトを要求できるようにします。
無料のウェブサイトをサポートしてeBookを所有してください!
- 22のデザインパターンと8つの原則を詳細に説明
- 406の適切に構造化された、読みやすい、言語のないページ
- 228個の明確で役立つ図と図
- 4つの言語のコード例を含むアーカイブ
- サポートされているすべてのデバイス:EPUB / MOBI / PDF形式
詳細…