ファクトリメソッドは、オブジェクトの作成に関連する作成デザインパターンです。ファクトリパターンでは、作成ロジックをクライアントに公開せずにオブジェクトを作成し、クライアントは同じ共通インターフェイスを使用して新しいタイプのオブジェクトを作成します。
アイデアは、静的メンバー関数(静的ファクトリメソッド)を使用して&はインスタンスを返し、クラスモジュールの詳細をユーザーから隠します。
ファクトリパターンは、オブジェクトを作成するためのコア設計原則の1つであり、クライアントがオブジェクトを作成できるようにします。ライブラリのクラス階層と緊密に結合しないような方法でのライブラリ(以下で説明)の。
ライブラリとクライアントについて話すときはどういう意味ですか?
ライブラリは、一部のパブリックAPIを公開し、クライアントがそれらのパブリックAPIを呼び出してタスクを完了するサードパーティによって提供されるものです。非常に単純な例として、AndroidOSが提供するさまざまな種類のビューがあります。
なぜファクトリパターンなのですか?
例を挙げて理解しましょう。
出力:
I am two wheeler
上記の設計の問題は何ですか?
上記の例で観察したように、クライアントはいずれかのTwoWheelerのオブジェクトを作成しますまたは、オブジェクトの構築中の入力に基づくFourWheeler。
たとえば、ライブラリは、三輪車も組み込む新しいクラスThreeWheelerを導入します。どうなるでしょうか? ThreeWheelerのオブジェクトを作成するために条件付きラダーにある場合、クライアントは新しいelseをチェーンすることになります。次に、クライアントを再コンパイルする必要があります。したがって、ライブラリ側で新しい変更が行われるたびに、クライアントは最後に対応する変更をいくつか行い、コードを再コンパイルする必要があります。悪いですね。これは設計の非常に悪い習慣です。
問題を回避する方法は?
答えは、静的(またはファクトリ)メソッドを作成することです。以下のコードを見てみましょう。
出力:
I am three wheeler
上記の例では、オブジェクト作成のタイプの選択をクライアントから完全に切り離しています。ライブラリは、入力に基づいて作成するオブジェクトタイプを決定する責任があります。クライアントは、ライブラリのファクトリCreateメソッドを呼び出して、オブジェクトの作成の実際の実装を気にせずに、必要な型を渡すだけです。
上記の説明を提供してくれたRumplestiltskinに感謝します。
ファクトリメソッドの他の例:
- たとえば、「描画」システムでは、ユーザーの入力に応じて、正方形、長方形、円などのさまざまな画像を描画できます。ここでは、ファクトリメソッドを使用して、ユーザーの入力に応じてインスタンスを作成できます。新しいタイプの形状を追加するために、クライアントのコードを変更する必要はありません。
- 別の例:旅行サイトでは、電車のチケット、バスのチケット、飛行機のチケットを予約できます。この場合、ユーザーは自分の旅行タイプを「バス」、「電車」、または「フライト」として指定できます。
ここに、ユーザーの旅行タイプに応じて、静的メンバー関数「GetObject」を持つ抽象クラス「AnyTravel」があります。 ‘BusTravel’または ‘TrainTravel’の&戻りオブジェクトを作成します。 「BusTravel」または「TrainTravel」には、乗客名、出発地、目的地パラメータなどの一般的な機能があります。
最初の2つの例を提供してくれたAbhijitSahaに感謝します。