該当する機会:
7.3工場モデルに適用可能な機会
新しいオブジェクトを作成する最も簡単な方法は、新しいキーワードとコンクリートクラスを使用することです。場合によってのみ、オブジェクトファクトリーを作成して維持するという特別な複雑さは、お金の価値があります。このセクションでは、これらの機会をまとめます。
7.3.1動的実装
以前の自転車の例のように、同じインターフェイスを異なる方法で実装するオブジェクトを作成する必要がある場合は、工場メソッドまたは単純な工場オブジェクトを使用して、実装の選択プロセスを簡素化できます。この選択は、明示的または暗黙的に行うことができます。前者は自転車の例のようなものであり、顧客は必要な自転車モデルを選択できます。次のセクションで説明したXHRファクトリーの例は後者に属します。この例で返される接続オブジェクトのタイプは、検出された帯域幅とネットワークの遅延係数に依存します。これらの状況では、通常、同じインターフェイスを実装し、均等に扱うことができる一連のクラスに対処する必要があります。これは、JavaScriptで工場パターンを使用する最も一般的な理由です。
7.3.2オーバーヘッドを設定します
オブジェクトが複雑で相互に関連する必要がある場合、工場モードを使用すると、各オブジェクトに必要なコードの量を減らすことができます。この設定は、特定のタイプのすべてのインスタンスに対して1回だけ実行する必要がある場合に特に顕著です。この設定コードをクラスコンストラクターに配置することは、効率的なアプローチではありません。設定作業が完了しても、新しいインスタンスが作成されるたびにコードが実行され、設定コードが異なるクラスに配布されるためです。工場の方法は、この機会に最適です。必要なすべてのオブジェクトをインスタンス化する前に、一度に設定できます。いくつの異なるクラスがインスタンス化されていても、この方法はセットアップコードを1つの場所に保持できます。
これは、使用されるクラスが外部ライブラリをロードする必要がある場合に特に便利です。工場の方法は、これらのライブラリをチェックし、見つからないライブラリを動的にロードできます。これらの設定コードは1か所にのみ存在するため、後で変更する方がはるかに便利です。
7.3.3多くの小さなオブジェクトを備えた大きなオブジェクトを作成します
工場の方法は、多くの小さなオブジェクトをカプセル化するオブジェクトを作成するために使用できます。自転車オブジェクトのコンストラクターを検討してください。自転車には、ホイール、フレーム、伝送コンポーネント、ブレーキの多くの小さなサブシステムが含まれています。サブシステムとより大きなオブジェクトの間に強い結合が必要であるが、実行時に多くのサブシステムから選択したい場合は、工場アプローチが理想的な選択です。このテクノロジーを使用すると、販売するすべてのバイクを何らかのチェーンで一致させることができます。翌日、別のお気に入りのチェーンを見つけた場合は、代わりにこの新しい品種を使用できます。これらの自転車クラスのコンストラクターは特定のチェーンの種類に依存していないため、この変更を実装するのは簡単です。この章の後半のRSSリーダーの例は、この点で工場モデルの使用を示しています。
工場パターンは、主にオブジェクトを作成するためのインターフェイスを提供します。工場モデルは、「Java and Pattern」の用語に従って3つのカテゴリに分かれています。
1。シンプルな工場
2。工場法
3。抽象工場
これらの3つのパターンは、徐々に上から下まで抽象的であり、より一般的です。単純な工場モデルを工場メソッドモデルの特別なケースと見なすための分類方法もあり、2つは同じカテゴリに分類されます。工場モードが使用される2つの状況を次に示します。
1.エンコードするとき、どのようなインスタンスを作成する必要があるかを予測することはできません。
2。システムは、製品クラスのインスタンスがどのように作成、組み合わされ、表現されるかの詳細に依存してはなりません
3。シンプルな工場モデル
名前が示すように、このモデル自体はシンプルで、ビジネスがより単純な状況で使用されます。
これは3つの役割で構成されています(関係については、以下のクラス図を参照):
1。工場の役割:これは、特定のビジネスロジックと判断の論理を含むこのモデルの中核です。 Javaでは、しばしば具体的なクラスによって実装されます。
2。抽象製品の役割:一般に、特定の製品または実装されたインターフェイスによって継承される親クラスです。 Javaのインターフェイスまたは抽象クラスによって実装されています。
3。特定の製品の役割:工場クラスによって作成されたオブジェクトは、この役割のインスタンスです。 Javaの具体的なクラスによって実装されています。
では、単純な工場モデルを使用する方法は?例を挙げましょう。これは、長い理論的なテキストの説明よりもはるかに理解しやすいと思います!ヌーボーリッチの治療法は次のとおりです
シンプルな工場モデルを使用した後、ヌーボーリッチは車内に座ってドライバーに「運転」と言うだけであるようになりました。それがどのように実装されているか見てみましょう:
//抽象製品ロールパブリックインターフェイスカー{public void drive(); } //特定の製品ロールパブリッククラスベンツ実装car {public void drive(){system.out.println( "driving benz"); }} public class bmw実装car {public void drive(){system.out.println( "driving bmw"); }}。 。 。 (私はアウディを書きません:p)//工場クラスの役割パブリッククラスドライバー{//工場メソッド//返品タイプは抽象的な製品であることに注意してくださいpublic static car drivercar(string s)throws Exception {// Judge rogic、特定の製品ロールをクライアントに返します(S. qualsignorecase( "benz"))return new benz(); else if(s.equalsignorecase( "bmw"))を返すnew bmw(); ......それ以外の場合は、新しい例外をスローします(); 。 。 。 //ヌーボーリッチを歓迎します... public class magnate {public static void main(string [] args){//メルセデスベンツカー= driver.drivercar( "benz"); //コマンドを指定します:drive(); 。 。すべてのクラスを1つのファイルに配置した場合、1つのクラスだけが公開されていることを忘れないでください。プログラム内のクラス間の関係は次のとおりです。
これは単純な工場モデルです。ここに利点があります:
まず第一に、単純な工場モデルを使用した後、私たちのプログラムは「病気」ではなく、現実に沿っています。また、クライアントは、製品オブジェクトを直接作成する責任から免除されますが、(ヌーボーリッチが行っているように)製品の「消費」のみを担当しています。
開閉の原則から、単純な工場モデルを分析しましょう。 Nouveau Richeが車を追加すると、抽象製品によって策定された契約を満たしている限り、工場に通知されている限り、顧客が使用できます。したがって、製品部分については、開閉の原則に準拠しています - 拡張と修正のための閉鎖のための開口部。しかし、工場部分は理想的ではないようです。なぜなら、車が追加されるたびに、対応するビジネスロジックと判断ロジックを工場クラスに追加する必要があり、自然に開閉の原則に違反するからです。
このような工場のクラス(私たちの場合はドライバーの場合)では、全能のクラスまたは神の階級と呼びます。
私たちが示す例は最も単純なケースであり、実際のアプリケーションでは、製品がマルチレベルのツリー構造である可能性があります。これらの製品に対応するための単純な工場モデルには、工場クラスが1つしかないため、これは私たちの神のクラスを台無しにし、私たちの素敵なプログラマーを使い果たすかもしれません:(
先に述べたように、単純な工場モデルは、ビジネスがシンプルになる状況に適しています。しかし、それは複雑なビジネス環境にあまり適応できないかもしれません。これは、Factory Method Modelで実行する必要があります! !
4。工場メソッドモデル
最初にその構成を見てみましょう:
1。抽象的な工場の役割:これは工場のメソッドパターンの中核であり、アプリケーションとは何の関係もありません。これは、特定の工場の役割が実装しなければならないインターフェースまたは継承する必要がある親クラスです。 Javaでは、抽象クラスまたはインターフェイスによって実装されています。
2。特定の工場の役割:特定のビジネスロジックに関連するコードが含まれています。アプリケーションによって呼び出され、対応する特定の製品オブジェクトを作成します。 Javaでは、コンクリートクラスによって実装されています。
3。抽象製品の役割:特定の製品または実装されたインターフェイスによって継承される親クラスです。 Javaには、一般的にそれらを実装するための抽象クラスまたはインターフェイスがあります。
4。特定の製品の役割:特定の工場の役割によって作成されたオブジェクトは、この役割の例です。 Javaの具体的なクラスによって実装されています。
クラス図を使用して、それらの間の関係を明確に表します。
完全な例を使用して、工場モデルのさまざまな役割がどのように調整されているかを見てみましょう。ヌーボーリッチビジネスといえば、彼らはますます多くの車を愛しています。これにより、ドライバーは苦しみました。彼は車を覚えて維持しなければならなかったので、彼はそれを使わなければなりませんでした!だからヌーボーの豊かさは彼に同情し、言った:それは私とのあなたの年に依存している、あなたは将来それほど一生懸命働く必要はないだろう。私はあなたに数人のスタッフを割り当てます、ただ彼らの世話をしてください!したがって、工場メソッドモデルの管理が登場しました。コードは次のとおりです。
//抽象製品の役割、特定の製品の役割は単純な工場モデルに似ていますが、もう少し複雑になりました。ここでは少し省略されています。 //抽象工場の役割パブリックインターフェイスドライバー{public car drivercar(); } public class benzdriverはドライバーを実装しています{public car drivercar(){return new benz(); }} public class bmwdriver explments driver {public car drivercar(){return new bmw(); }} ...... //それは特定の製品との対応する関係を形成する必要があります。カーカー= driver.drivercar(); car.drive(); } catch(例外e){}}}ファクトリーメソッドは、コンクリートクラスを単純な工場パターンのコアとして使用する代わりに、抽象的な工場の役割をコアとして使用します。工場メソッドモデルが私たちにもたらしたものを見てみましょう。工場メソッドモデルを分析するには、開閉の原則を使用します。抽象製品の役割と抽象的な工場の役割によって提供される契約に従って生成されている限り、新製品(つまり、ヌーボーリッチの車)が生成されると、既存のコードを変更することなく顧客が使用できます。 Factoryメソッドモデルは、開閉の原則と完全に一致しているようです!
工場アプローチモデルを使用するだけで、遭遇する可能性のあるビジネスニーズのほとんどに対処するのに十分です。ただし、多くの種類の製品がある場合、多数の対応する工場カテゴリが表示されますが、これは私たちが望むものではありません。したがって、この場合の単純な工場パターンを使用することをお勧めします。ファクトリーメソッドパターンと組み合わせて、工場クラスを削減します。つまり、製品ツリーの類似種の単純な工場パターンを使用します(通常、ツリーの葉の兄弟であるもの)。
もちろん、特別な状況は特別な治療で処理する必要があります。システム内のさまざまな製品ツリーと製品ツリーに製品ファミリがあり、この場合、抽象的な工場モデルを使用できます。
5。概要
Simple Factory Model and Factory Method Modelから与えられたインスピレーションを見てみましょう。
工場パターンを使用して例を実装しない場合、コードははるかに少なくなる可能性があります。多型を使用せずに、既存の車を実装するだけです。しかし、保守性の観点からは、スケーラビリティは非常に貧弱です(車を追加した後に触れたいクラスを想像できます)。したがって、スケーラビリティとメンテナンスを改善するために、より多くのコードを書く価値があります。
6。抽象的な工場パターン
まず、製品ファミリが何であるかを理解しましょう。さまざまな製品階層や構造にある機能で構成される製品のファミリーです。この文を読んでこの概念を明確に理解できるなら、私はあなたを賞賛しなければなりません。例を使用して、それを鮮明に説明しましょう。
図のBMWCARとBENZCARは、2つの製品ツリー(製品階層)です。一方、図に示すようにBenzsportscarとBmwsportscarは1つの製品ファミリです。それらはすべてスポーツカーファミリーに配置できるため、機能は関連しています。同様に、BmwBussinessCarとBenzsportscarも同じ製品ファミリです。
抽象製品モデルのトピックに戻ると、それと工場メソッドモデルの違いは、オブジェクトを作成する必要性の複雑さにあると言えます。さらに、抽象的な工場モデルは、3つの中で最も抽象的で一般的です。抽象的な工場パターンの目的は、クライアントにインターフェイスを提供して、複数の製品ファミリで製品オブジェクトを作成することです。さらに、抽象的な工場パターンを使用する場合、次の条件を満たす必要があります。
1.システムには複数の製品ファミリがあり、システムは一度に1つの製品のみを消費できます。
2。同じ製品ファミリに属する製品を使用します。
抽象的な工場パターンのさまざまな役割(工場法とまったく同じ)を見てみましょう。
抽象的な工場の役割:これはファクトリーメソッドパターンの中核であり、アプリケーションとは何の関係もありません。これは、特定の工場の役割が実装しなければならないインターフェースまたは継承する必要がある親クラスです。 Javaでは、抽象クラスまたはインターフェイスによって実装されています。
特定の工場の役割:特定のビジネスロジックに関連するコードが含まれています。アプリケーションによって呼び出され、対応する特定の製品オブジェクトを作成します。 Javaでは、コンクリートクラスによって実装されています。
抽象製品の役割:それは、特定の製品継承の親クラスまたは実装インターフェイスです。 Javaには、一般的にそれらを実装するための抽象クラスまたはインターフェイスがあります。
特定の製品の役割:特定の工場の役割によって作成されたオブジェクトは、この役割のインスタンスです。 Javaの具体的なクラスによって実装されています。
最初の2つのモードを読んだ後、このモードのさまざまなキャラクター間の調整について明確なアイデアを得る必要があるため、具体的な例を挙げません。抽象的な工場モデルを使用するための条件を満たすことに注意を払わなければならないということです。そうでなければ、複数の製品ツリーがある場合でも、まだ製品ファミリがありますが、使用できません。
上記の記事には、Javaの3つの工場モデルを深く理解しています。これは私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。