この記事では、Javaデザインパターンの工場モデルについて説明します。次のように、参照のために共有してください。
1。シンプルな工場
最初に質問について考えてみましょう。プログラムを書くと、そのような状況があります。オブジェクトAはオブジェクトBの方法を呼び出す必要があります。この時点で、新しいキーワードを使用してインスタンスBを作成し、インスタンスBの方法を呼び出します。このアプローチの欠点は、クラスAの方法がクラスBのクラス名を直接呼び出すことです(この方法はハードコーディングカップリングとも呼ばれます)。システムをリファクタリングする必要がある場合:クラスBの代わりにクラスCを使用する必要がある場合、プログラムはクラスAコードを変更する必要があります。アプリケーション内の100または10,000のクラスがハードコーディングされている場合、100か月または10,000の場所を変更する必要があります。これは明らかに非常にひどいことです。
この問題を別の観点から見ると、すでにオブジェクトAの場合、オブジェクトBの方法を呼び出す必要があり、オブジェクトBの実装と作成プロセスを気にする必要はありません。クラスBにIBインターフェイスを実装する必要がありますが、クラスAはIBインターフェイスと結合する必要があります。 IBファクトリーに電話してIBインスタンスを取得します。上記の設計を通じて:クラスBの代わりにクラスCを使用する必要がある場合、クラスCがIBインターフェイスを実装し、IBFactory工場でIBインスタンスを作成するための実装コードを書き直して、工場がCインスタンスを生成できるようにする必要があります。複数のクラスオブジェクトを生成のための工場クラスに渡すこの設計方法は、単純な工場パターンと呼ばれます。
単純な工場パターンのコードは次のとおりです。
/***シンプルな工場モード*工場で制作されたオブジェクトインスタンスを必要とする一般的なインターフェイス*ヘアスタイルインターフェイス* @Author Administrator**/public Interface Hair {/*** draw Hairstyle*/public void Draw();}/***左側のディストリビューションヘアスタイル* @author管理者*/パブリッククラスlefthair lefthairriade boid draw() System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * */public class Righthairは髪を実装しています{@Override public void draw(){ System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Administrator */public hairtest {public static void main(] hairfactory = new hairfactory()factory.gethair();ご覧のとおり、Hairtestで生成されたLefthairをRighthairに変更したい場合は、HairFactoryのGethairメソッドの実装を変更するだけです。
シンプルな工場モードを使用する利点は、オブジェクト発信者とオブジェクト作成プロセスを分離することです。オブジェクトコーラーがオブジェクトを必要とする場合、それは工場から直接要求することができ、それにより、オブジェクトの発信者とオブジェクトの実装クラスがハードコーディングされた方法で結合されているため、システムの保守性とスケーラビリティを改善することができます。もちろん、工場モデルには小さな欠陥もあります。製品が変更された場合、工場クラスもそれに応じて変更する必要があります。ここでは、ポリシーモデルを使用して解決できます。以下はコードです。
パブリックインターフェイスヘアビルダー{ / ***ヘアスタイルを作成* @return* / public hair gethair();}パブリッククラスのLefthairbuilderはヘアビルダーを実装します{@Override public hair gethair(){return new lefthair(); }} public class righthairbuilderはヘアビルダーを実装します{@Override public hair gethair(){return new righthair(); }} public class hairfactory {private hairbuilder hairbuilder; public hairfactory(hairbuilder hairbuilder){this.hairbuilder = hairbuilder; } public void sethairbuilder(hairbuilder hairbuilder){this.hairbuilder = hairbuilder; } public hair gethair(){return hairbuilder.gethair(); }} public class hairtest {public static void main(string [] args){// hairbuilder builder = new lefthairbuilder(); HairBuilder Builder = new RighthairBuilder(); HairFactory Factory = new HairFactory(Builder);ヘアヘア= Factory.gethair(); hair.draw(); }}このアプローチの利点は、工場クラスをもう変更する必要がなく、さまざまな戦略に従って工場の作成ロジックを抽象化する必要がないことです。プログラムはどのオブジェクトを作成する必要がありますか?対応するビルダーをネットワーク工場に渡すだけです。
2。工場法
シンプルな工場モデルでは、システムは工場クラスを使用してすべての製品インスタンスを生成し、ファクトリークラスは、生産するインスタンスのクラス、つまり工場クラスがすべての論理的判断、インスタンスの作成、その他の作業を担当するかを決定します。
工場クラスで論理的な判断を下したくない場合、プログラムはさまざまな製品カテゴリに異なる工場を提供でき、工場クラスで複雑な論理的判断を下すことなく、さまざまな工場クラスが異なる製品を生成できます。これは、上記の戦略モデルと組み合わせた単純な工場モデルに少し似ています。違いは、前者には工場が1つしかないのに対し、後者には複数の工場が必要であることです。以下は、工場メソッドパターンのコードです。
/***工場メソッドパターン*工場で作成されたオブジェクトインスタンスによって実装される必要があります* @Author Administrator**/public Interface Person {public void drawerson();} public class man explention person System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @Author Administration */Persure -Ride Public Person getPerson(){Client test class * */public class {public static void(string [] argury persontory = new manfactory factory(); Factory.getPerson();この種の典型的な特徴は、クライアントコードのさまざまな工場に従って対応する製品を生産することであり、すべての複雑なロジックを工場クラスに入れるために判断する必要はないことです。この実装には明らかな欠陥があります。つまり、クライアントは工場クラスと結びついています。
3。抽象工場
工場メソッドの上記の設計アーキテクチャを使用して、クライアントコードは呼び出されたオブジェクトの実装クラスから正常に分離されますが、別のカップリングをもたらします。クライアントコードは異なる工場クラスと結合されます。この結合の問題を解決するには、工場のクラスを追加して工場のインスタンスを生成し、製品を生産するためにクライアントからファクトリーを分離することを検討してください。この設計方法は、抽象工場モデルと呼ばれます。以下は、抽象的な工場パターンのコードです
/*** abstract Factory Pattern* Factory Producing PersonFactory* @Author Administrator**/Public Class PersonFactoryFactory {public Static PersonFactory getPersonFactory(string type){if(type.equalsignorecase( "man")){return new manfactory(); } else {return new WomenFactory(); }}}/** *クライアントテストクラス * @author Administrator * */public class persontest {public static void main(string [] args){personfactory factory = personfactoryfactory.getPersonFactory( "man"); Person Person = Factory.getPerson(); person.drawperson(); }}Java関連のコンテンツについては、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの概要」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。