JAVA デザイン パターン 2: ファクトリ メソッド パターン。オブジェクトのインスタンス化プロセスをサブクラスにカプセル化します。

著者のホームページ:デザイナー Xiao Zheng
著者の簡単な紹介: JAVA テクノロジ、システム カスタマイズ、リモート ガイダンスに重点を置いた 3 年間の JAVA フルスタック開発経験、エンタープライズ デジタル トランスフォーメーションに専念、CSDN カレッジおよび Blue Bridge クラウド コースの認定講師。
主な方向性: Vue、SpringBoot、WeChat アプレット

この記事では、Java デザイン パターンのファクトリ メソッド パターンについて説明し、サンプル コードを示します。ファクトリ メソッド パターンは、オブジェクトのインスタンス化プロセスをサブクラスにカプセル化する方法を提供する作成デザイン パターンです。

ここに画像の説明を挿入


1. ファクトリメソッドパターンとは

ファクトリ メソッド パターンは、オブジェクトのインスタンス化プロセスをサブクラスにカプセル化する方法を提供する作成デザイン パターンです。ファクトリ メソッド パターンでは、親クラスがオブジェクトを作成するためのインターフェイスを定義しますが、特定のオブジェクトの作成はサブクラス。このようにして、オブジェクトのインスタンス化プロセスがサブクラスに遅延されるため、サブクラスは必要に応じて特定のオブジェクトを作成できます。

ファクトリ メソッド パターンには、通常、抽象ファクトリ クラスと複数の具象ファクトリ クラスが存在します。抽象ファクトリ メソッドは抽象ファクトリ クラスで定義され、抽象製品クラスのインスタンスを返します。特定のファクトリ クラスは、抽象ファクトリ クラスを継承し、特定の製品クラスのインスタンスを返すファクトリ メソッドを実装します。

ファクトリ メソッド パターンの利点は、オブジェクトの作成と使用が分離され、システムの柔軟性と拡張性が向上することです。抽象ファクトリ クラスと具象ファクトリ クラスを導入することにより、オープンとクローズの原則に準拠した新しい製品クラスと対応するファクトリ クラスを簡単に追加できます。

ファクトリ メソッド パターンは次の3 3に適用されます。3種類のシチュエーション、じっくり勉強してください。

  • クラスが必要なオブジェクトの正確なクラスを知らない場合。
  • クラスがサブクラスに作成されたオブジェクトを指定することを要求する場合。
  • クラスがオブジェクトの作成を複数の具象ファクトリ クラスの 1 つに委任し、オブジェクトを作成したクラスから具象ファクトリ クラスの選択と使用を分離したい場合。

一般に、ファクトリ メソッド パターンは、サブクラスへのオブジェクトの作成を遅らせることで柔軟なオブジェクトの作成を実現し、システムのスケーラビリティと再利用性を向上させます。

ここに画像の説明を挿入


2. ファクトリメソッドパターンとは何ですか?

2.1 単純なファクトリーパターン

シンプル ファクトリ モード:ファクトリ クラスは静的メソッドを通じてオブジェクトを作成し、 に渡されたパラメータのタイプに従ってどの特定の製品オブジェクトを作成するかを決定します。サンプル コードは次のとおりです。

// 抽象产品类
interface Product {
    
    
    void operation();
}

// 具体产品类A
class ConcreteProductA implements Product {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductA operation");
    }
}

// 具体产品类B
class ConcreteProductB implements Product {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductB operation");
    }
}

// 简单工厂类
class SimpleFactory {
    
    
    public static Product createProduct(String type) {
    
    
        if (type.equals("A")) {
    
    
            return new ConcreteProductA();
        } else if (type.equals("B")) {
    
    
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端使用
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Product productA = SimpleFactory.createProduct("A");
        productA.operation();

        Product productB = SimpleFactory.createProduct("B");
        productB.operation();
    }
}

2.2 ファクトリメソッドパターン

ファクトリ メソッド モード:各特定の製品は特定のファクトリに対応し、抽象ファクトリ クラスはファクトリ メソッドを定義し、サブクラスは特定のファクトリ メソッドを実装して製品オブジェクトを作成します。サンプル コードは次のとおりです。

// 抽象产品类
interface Product {
    
    
    void operation();
}

// 具体产品类A
class ConcreteProductA implements Product {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductA operation");
    }
}

// 具体产品类B
class ConcreteProductB implements Product {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductB operation");
    }
}

// 抽象工厂类
interface Factory {
    
    
    Product createProduct();
}

// 具体工厂类A
class ConcreteFactoryA implements Factory {
    
    
    @Override
    public Product createProduct() {
    
    
        return new ConcreteProductA();
    }
}

// 具体工厂类B
class ConcreteFactoryB implements Factory {
    
    
    @Override
    public Product createProduct() {
    
    
        return new ConcreteProductB();
    }
}

// 客户端使用
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.operation();

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.operation();
    }
}

上記は、一般的な 2 つのファクトリ メソッド パターンのサンプル コードであり、それぞれ簡易ファクトリ パターンとファクトリ メソッド パターンの実装方法を示していますので、実際のニーズに応じて適切な方法を選択してファクトリ メソッド パターンを実装してください。

ここに画像の説明を挿入


3. ファクトリメソッドパターンの適用シナリオ

ファクトリ メソッド パターンは次の4 4に適用されます。4つのシナリオ:

  1. ファクトリ メソッド パターンは、クラスが必要とするオブジェクトの正確なクラスを知らない場合に使用できますたとえば、グラフィック描画プログラムは、ユーザーの選択に従ってさまざまなタイプのグラフィック オブジェクトを作成する必要がありますが、特定のグラフィック タイプはコンパイル時に決定できません。
  2. ファクトリ メソッド パターンは、クラスがサブクラスに作成されたオブジェクトを指定する必要がある場合に使用できますたとえば、抽象クラスは、サブクラスの抽象メソッドを定義して、そのメソッドを実装し、具象オブジェクトを作成します。
  3. ファクトリ メソッド パターンは、クラスがオブジェクトの作成を複数の具象ファクトリ クラスの 1 つに委任し、オブジェクトを作成するクラスから具象ファクトリ クラスの選択と使用を分離したい場合に使用できますたとえば、ロガー クラスは、現在の環境に応じて、ファイル ロガー、データベース ロガー、ネットワーク ロガーのいずれを使用するかを選択する必要があります。
  4. 既存のコードを変更せずに拡張機能を通じて新しい製品クラスを追加する必要がある場合は、ファクトリ メソッド パターンを使用できますたとえば、電子商取引プラットフォームでは、新しい支払い方法を継続的に追加する必要がありますが、これは新しい支払いファクトリ クラスを追加することで実現できます。

一般に、ファクトリ メソッド パターンは、さまざまな条件に従ってさまざまなタイプのオブジェクトを作成する必要があり、オブジェクトの作成を、そのオブジェクトを特に使用するクラスから分離することが望ましいシナリオに適しています。これにより、オブジェクトを作成する柔軟な方法が提供され、システムの拡張性と再利用性が向上します。

ここに画像の説明を挿入


4番目、ファクトリーメソッドパターンの面接の質問

  1. ファクトリメソッドパターンとは何ですか?
  2. ファクトリ メソッド パターンとシンプル ファクトリ パターンの違いは何ですか?
  3. ファクトリ メソッド パターンの役割は何ですか?
  4. ファクトリメソッドパターンの利点は何ですか?
  5. ファクトリメソッドパターンの欠点は何ですか?
  6. ファクトリ メソッド パターンは Java でどのように実装されますか?
  7. ファクトリ メソッド パターンはどのようなシナリオに適していますか?
  8. ファクトリ メソッド パターンと抽象ファクトリ パターンの違いは何ですか?
  9. ファクトリ メソッド パターンを使用してロガーを実装する例を簡単に説明します。
  10. ファクトリ メソッド パターンとシングルトン パターンを併用できますか?

V. まとめ

この記事では Java デザインパターンのファクトリメソッドパターンとサンプルコードを説明しましたが、次回は Java 抽象ファクトリパターンについて説明します。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_41464123/article/details/131997668