ファクトリ パターン: 主に、共通のインターフェイスでクラスをインスタンス化するために使用されます。ファクトリ パターンは、どのクラスをインスタンス化するかを動的に決定できます。
ファクトリーパターンの形式
ファクトリーパターンは主に以下の形式を使用します:
1: シンプルファクトリー。
2: 工場出荷時の方法。
3: 抽象的な工場。
シンプル ファクトリ
は静的ファクトリとも呼ばれ、ファクトリ パターンの 3 つの状態の中で最も単純な構造です。主に、パラメータを受け取り、そのパラメータに基づいて、同じインターフェイスを実装するさまざまなクラスのインスタンスを返す静的メソッドがあります。具体的な例を見てみましょう:
ある工場で洗濯機、冷蔵庫、エアコンなどを生産しているとします。
最初にすべての製品に共通の製品インターフェースを定義します
public interface Product{}
それからこの工場を作りましょう すべての製品はこのインターフェースを実装する必要があります
public class Washer implements Product{ public Washer(){ System.out.println("洗衣机被制造了"); } } public class Icebox implements Product{ public Icebox(){ System.out.println("冰箱被制造了"); } } public class AirCondition implements Product{ public Icebox(){ System.out.println("空调被制造了"); } }
次に、上記の製品の生産を担当するファクトリ クラスを作成します
public class SimpleFactory { public static Product factory(String productName) throws Exception{ if(productName.equals("Washer")){ return new Washer(); }else if(productName.equals("Icebox")){ return new Icebox(); }else if(productName.equals("AirCondition")){ return new AirCondition(); }else{ throw new Exception("没有该产品"); } } }
このファクトリ クラスを使用して、注文を開始できます。SimpleFactory は、さまざまな注文に基づいてどの製品を生産するかを決定します種類。
public static void main(String[] args) { try { SimpleFactory.factory("Washer"); SimpleFactory.factory("Icebox"); SimpleFactory.factory("AirCondition"); } catch (Exception e) { e.printStackTrace(); } }
上記のコードからわかるように、Simple Factory のコアは SimpleFactory クラスであり、必要な論理判断機能と、すべてのプロダクトを作成する権限を持っています。私たちが望むもの。これはとても便利に使えそうです。
しかし、実際には、この SimpleFactory には多くの制限があります。まず、新しい製品を追加するたびに、SimpleFactory の元のコードを変更する必要があります。第二に、製品が多数あり、製品間に複雑な階層関係がある場合、このクラスには複雑な論理判断機能が必要となり、コード量は増加し続け、将来のメンテナンスに負担がかかるだけです。単語ホラー...
また、SimpleFactoryクラスに問題が発生すると、システム全体がSimpleFactoryクラスに大きく依存しており、これが最も致命的な点でもあります。 ..
上記の欠点は、工場出荷時のパターンの他の 2 つの状態では解決されます。
ファクトリメソッド
上記のコードは、単純なファクトリが単純ではないことを示しています。これはモデル全体の核であり、一度問題が発生すると、リスクを軽減するためにモデル全体が影響を受け、機能しなくなります。将来に備える 保守や拡張に備えるためには、再構築し工場方式を導入する必要があります。
ファクトリ メソッドは、ポリモーフィズムを使用してファクトリ クラスの機能を弱めるファクトリ クラスのインターフェースを定義します。 以下はファクトリ インターフェースの定義です:
public interface Factory{ public Product create(); } 我们再来定义一个产品接口 public interface Product{} 一下是实现了产品接口的产品类 public class Washer implements Product{ public Washer(){ System.out.println("洗衣机被制造了"); } } public class Icebox implements Product{ public Icebox(){ System.out.println("冰箱被制造了"); } } public class AirCondition implements Product{ public Icebox(){ System.out.println("空调被制造了"); } } 接下来,就是工厂方法的核心部分,也就是具体创建产品对象的具体工厂类, //创建洗衣机的工厂 public class CreateWasher implements Factory{ public Product create(){ return new Washer(); } } //创建冰箱的工厂 public class CreateIcebox implements Factory{ public Product create(){ return new Icebox(); } } //创建空调的工厂 public class CreateAirCondition implements Factory{ public Product create(){ return new AirCondition(); } }
上記のプロダクト オブジェクトを作成するコードからわかるように。ファクトリ メソッドと単純なファクトリの主な違いは、単純なファクトリは製品を作成するすべての機能を 1 つのクラスに配置するのに対し、ファクトリ メソッドは、このように、たとえ異なる製品をファクトリ インターフェイスを実装する異なるファクトリ クラスに配置することです。ファクトリ クラスの 1 つに問題がある場合でも、他のファクトリ クラスも相互に影響を与えることなく正常に動作します。将来新しい製品を追加する場合、変更せずにこれを実現するにはファクトリ インターフェイスを実装するファクトリ クラスを追加するだけです。既存のコード。しかし、工場方式には限界もあります。たとえば、家電製品に加えて携帯電話製品も工場で生産している場合です。これら 2 つのファミリーには多数の製品が含まれており、各製品には複数のモデルがあるため、複雑な製品ツリーを形成しています。ファクトリ メソッドを使用してこの製品ファミリ システムを設計する場合、製品のモデルごとに対応するファクトリ クラスを作成する必要があります。製品が数百または数千ある場合は、対応するファクトリ クラスも存在する必要があります。これは伝説的なクラスの爆発につながりましたが、将来のメンテナンスにとっては単なる惨事でした...
抽象ファクトリー (ファクトリー メソッド)
抽象ファクトリー: 目的は、一連の相互関連または相互依存オブジェクトを作成することです。 f6e69c66fb0f681eb6023b9cb2818aa1>
個人的には、抽象ファクトリはファクトリ メソッドに基づいたカテゴリ管理の概念を導入したものだと思います...
ファクトリ メソッドは製品を作成するために使用され、カテゴリの概念は、一連の製品を作成するために使用されるため、製品の分類が抽象ファクトリーの焦点になります。
引き続き上記の例を使用して説明します。
工場で生産されるすべての製品は大文字を使用します。冷蔵庫などのモデルを示すと、「冷蔵庫-A」と「冷蔵庫-B」が存在します。同様に、他の製品もこの番号付けルールに従っており、製品ファミリーツリーが存在します
冷蔵庫:
冷蔵庫-A
冷蔵庫- B
洗濯機:
洗濯機-A
洗濯機-B
冷蔵庫と洗濯機を分類するために、2つの製品インターフェースを定義できます
//洗衣机接口 public interface Washer{ } //冰箱接口 public interface Icebox{ } 接着,我们分别创建这两个接口的具体产品 //洗衣机-A public class WasherA implements Washer{ public WasherA(){ System.out.println("洗衣机-A被制造了"); } } //洗衣机-B public class WasherB implements Washer{ public WasherB(){ System.out.println("洗衣机-B被制造了"); } } //冰箱-A public class IceboxA implements Icebox{ public IceboxA(){ System.out.println("冰箱-A被制造了"); } } //冰箱-B public class IceboxB implements Icebox{ public IceboxB(){ System.out.println("冰箱-B被制造了"); } } 到此,产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口 public interface Factory{ public Washer createWasher(); public Icebox createIcebox(); }
次に、特定の工場を作成しますクラス 上記の製品のインターフェイスに基づいて、モデル A の製品を 1 つの工場で管理するクラスに分割し、モデル B の製品を別の工場で管理するこの分類に従って、次のように実装できます。以下の 2 つの特定のファクトリー
//创建型号为A的产品工厂 public class FactoryA implements Factory{ //创建洗衣机-A public Washer createWasher(){ return new WasherA(); } //创建冰箱-A public Icebox createIcebox(){ return new IceboxA(); } } //创建型号为B的产品工厂 public class FactoryB implements Factory{ //创建洗衣机-B public Washer createWasher(){ return new WasherB(); } //创建冰箱-B public Icebox createIcebox(){ return new IceboxB(); } }
这样,我们的抽象工厂就完成了。有上面可以看出,在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分,但在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.
更多Java设计模式—工厂设计模式相关文章请关注PHP中文网!