logo

Java のファクトリ メソッド設計パターン

それは 創造的なデザインパターン それはオブジェクトの作成について話しています。ファクトリ設計パターンでは、オブジェクトを作成するためのインターフェイス (Java インターフェイスまたは抽象クラス) を定義し、どのクラスをインスタンス化するかをサブクラスに決定させるように指示されています。

工場方式



Java の Factory メソッド設計パターンに関する重要なトピック

Java のファクトリー メソッド設計パターンとは何ですか?

ファクトリ メソッド デザイン パターンはオブジェクトを作成するためのインターフェイスを定義しますが、どのクラスをインスタンス化するかはサブクラスに決定させます。ファクトリ メソッドでは、クラスのインスタンス化をサブクラスに延期できます。

ファクトリメソッドデザインパターンとは



上の画像の説明は以下の通りです。

  • インターフェイスのファクトリ メソッドを使用すると、クラスのインスタンス化を 1 つ以上の具体的なサブクラスに延期できます。
  • これらのデザイン パターンはオブジェクトのインスタンス化について説明しているため、創造的なデザイン パターンのカテゴリに分類されます。
  • 名前に気づいたら ファクトリーメソッド これは、ファクトリーであるメソッドが存在することを意味します。一般に、ファクトリーは創造的なものに関与しており、ここではこれによってオブジェクトが作成されます。
  • これは、オブジェクト作成ロジックがクライアントから隠蔽されるオブジェクトを作成する最良の方法の 1 つです。それでは実装を見てみましょう。

Java でファクトリ メソッド デザイン パターンを使用する場合は?

ファクトリ メソッドのデザイン パターンは、次の場合に Java で使用できます。

  • クラスは、作成する必要があるオブジェクトのタイプを予測できません。
  • クラスは、そのサブクラスに、そのクラスが作成するオブジェクトを指定することを要求します。
  • クラスは複数のヘルパー サブクラスの 1 つに責任を委任します。どのヘルパー サブクラスが委任されているかに関する情報を特定のスコープまたは場所内に保持することを目的としています。

ファクトリメソッド設計パターンの主要コンポーネント

Java のファクトリ メソッド設計パターンの主要コンポーネント



製品

  • これは、ファクトリが作成するオブジェクトの共通操作を定義する抽象クラスまたはインターフェイスです。
  • 具体的な Products は、Product インターフェイスを実装する実際のクラスであり、それぞれが作成される特定の種類のオブジェクトを表します。

クリエイター

  • ファクトリ メソッドを宣言する抽象クラスまたはインターフェイスです。
  • このメソッドは Product オブジェクトの作成を担当しますが、実際の作成はサブクラスに委任します。

コンクリートクリエイター

  • これらは、ファクトリ メソッドを実装する Creator のサブクラスです。
  • 彼らは、多くの場合、入力パラメータまたは構成に基づいて、どの具体的な製品を作成するかを決定します。

ファクトリーメソッド

  • これは、Product オブジェクトの作成を担当する Creator クラスで定義されたメソッドです。
  • 通常、Creator で抽象として宣言され、Concrete Creator で実装されます。

Java でのファクトリー メソッド設計パターンの例

問題文

あなたは、さまざまな種類の商品を扱う電子商取引プラットフォーム用のソフトウェア システムを開発しています。各製品カテゴリ (電子機器、衣料品、書籍など) は、作成時に特定の処理が必要です。ただし、柔軟性と保守性を高めるために、クライアント コードを具体的な製品作成ロジックから切り離したいと考えています。さらに、既存のコードを変更せずに、将来新しい製品タイプを追加することで簡単に拡張できるようにしたいと考えています。

抽象クラスを使用した解決策

上記の問題は、ファクトリ メソッド デザイン パターンを使用して解決できます。

ジャワ


AndroidでAppleの絵文字を取得する方法



// Abstract Product Class> abstract> class> Product {> >public> abstract> void> display();> }> // Concrete Products> class> ConcreteProductA>extends> Product {> >@Override> >public> void> display() {> >System.out.println(>'This is Concrete Product A.'>);> >}> }> class> ConcreteProductB>extends> Product {> >@Override> >public> void> display() {> >System.out.println(>'This is Concrete Product B.'>);> >}> }> // Creator Abstract Class> abstract> class> Creator {> >public> abstract> Product factoryMethod();> }> // Concrete Creators> class> ConcreteCreatorA>extends> Creator {> >@Override> >public> Product factoryMethod() {> >return> new> ConcreteProductA();> >}> }> class> ConcreteCreatorB>extends> Creator {> >@Override> >public> Product factoryMethod() {> >return> new> ConcreteProductB();> >}> }> // Client Code> public> class> FactoryMethodExample {> >public> static> void> main(String[] args) {> >Creator creatorA =>new> ConcreteCreatorA();> >Product productA = creatorA.factoryMethod();> >productA.display();> >Creator creatorB =>new> ConcreteCreatorB();> >Product productB = creatorB.factoryMethod();> >productB.display();> >}> }>

SpringフレームワークのMVC

>

>

出力

This is Concrete Product A. This is Concrete Product B.>

インターフェースを利用したソリューション

上記の問題は、ファクトリ メソッド デザイン パターンを使用して解決できます。

ジャワ




// Product Interface> interface> Product {> >void> display();> }> // Concrete Products> class> ConcreteProductA>implements> Product {> >@Override> >public> void> display() {> >System.out.println(>'This is Concrete Product A.'>);> >}> }> class> ConcreteProductB>implements> Product {> >@Override> >public> void> display() {> >System.out.println(>'This is Concrete Product B.'>);> >}> }> // Factory Interface> interface> Factory {> >Product factoryMethod();> }> // Concrete Factories> class> ConcreteFactoryA>implements> Factory {> >@Override> >public> Product factoryMethod() {> >return> new> ConcreteProductA();> >}> }> class> ConcreteFactoryB>implements> Factory {> >@Override> >public> Product factoryMethod() {> >return> new> ConcreteProductB();> >}> }> // Client Code> public> class> FactoryMethodExample {> >public> static> void> main(String[] args) {> >Factory factoryA =>new> ConcreteFactoryA();> >Product productA = factoryA.factoryMethod();> >productA.display();> >Factory factoryB =>new> ConcreteFactoryB();> >Product productB = factoryB.factoryMethod();> >productB.display();> >}> }>

>

>

出力

This is Concrete Product A. This is Concrete Product B.>

Java でのファクトリ メソッド設計パターンの使用例

Java でのファクトリ メソッド デザイン パターンの一般的なアプリケーションをいくつか示します。

  • 創作フレームワーク:
    • JDBC (Java Database Connectivity) は、接続、ステートメント、結果セットの作成にファクトリを広範囲に使用します。 Spring や Guice などの依存性注入フレームワークは、Bean の作成と管理をファクトリに大きく依存しています。
  • GUI ツールキット:
    • Swing と JavaFX はファクトリーを使用してボタン、テキストフィールド、ラベルなどの UI コンポーネントを作成し、UI デザインのカスタマイズと柔軟性を可能にします。
  • ロギングフレームワーク:
    • Log4j や Logback などのロギング フレームワークは、ファクトリを使用してさまざまな構成のロガーを作成し、ロギング レベルと出力先の制御を可能にします。
  • シリアル化と逆シリアル化:
    • オブジェクト シリアル化フレームワークは、多くの場合、ファクトリを使用してシリアル化されたデータからオブジェクトを作成し、さまざまなシリアル化形式とバージョン管理をサポートします。
  • プラグイン システム:
    • プラグインベースのシステムは多くの場合、ファクトリを使用してプラグイン インスタンスを動的にロードおよび作成し、拡張性とカスタマイズを可能にします。
  • ゲーム開発:
    • ゲーム エンジンは多くの場合、ファクトリを使用してさまざまな種類のゲーム オブジェクト、キャラクター、レベルを作成し、コードの編成と柔軟性を促進します。
  • ウェブ開発:
    • Web フレームワークは、ファクトリを使用してビュー コンポーネント、コントローラー、サービスを作成する場合があり、Web アプリケーションのモジュール性とテスト容易性を実現します。

Java のファクトリ メソッド設計パターンの利点

Java のファクトリ メソッド デザイン パターンの利点は次のとおりです。

  • デカップリング: これにより、オブジェクト作成ロジックが、それらのオブジェクトを使用するクライアント コードから分離されます。これにより、作成プロセスを変更してもクライアント コードを変更する必要がなくなるため、コードの柔軟性と保守性が向上します。
  • 拡張性: クライアント コードを変更せずに、新しい種類の製品を導入するのは簡単です。新しい Concrete Creator サブクラスを作成し、ファクトリ メソッドを実装して新しい製品を生成するだけです。
  • テスト容易性: テスト中に製品作成をモックまたはスタブアウトできるため、単体テストが簡素化されます。実際のオブジェクトの作成に依存せずに、さまざまな製品実装を個別にテストできます。
  • コードの再利用性: ファクトリ メソッドは、オブジェクトの作成が必要なアプリケーションのさまざまな部分で再利用できます。これにより、オブジェクト作成ロジックの一元化と再利用が促進されます。
  • カプセル化: これにより、具体的な製品クラスがクライアント コードから隠蔽され、コードが特定の実装に依存することが少なくなります。これにより、メンテナンス性が向上し、カップリングが軽減されます。

Java のファクトリ メソッド設計パターンの欠点

Java のファクトリ メソッド デザイン パターンの欠点は次のとおりです。

Maven をインストールする
  • 複雑さの増加: 追加のクラスとインターフェイスが導入され、抽象化の層が追加されるため、特にパターンに慣れていない人にとっては、コードの理解と保守がより複雑になります。
  • オーバーヘッド: 多態性と動的バインディングの使用はパフォーマンスにわずかに影響を与える可能性がありますが、ほとんどのアプリケーションでは無視できる程度です。
  • 製品階層内の緊密な結合: Concrete Creator は依然として、対応する Concrete 製品と密接に結合しています。一方を変更すると、もう一方も変更する必要が生じることがよくあります。
  • 具体的なサブクラスへの依存関係: クライアント コードは依然として抽象 Creator クラスに依存しているため、ファクトリ メソッドを正しく呼び出すにはその具体的なサブクラスの知識が必要です。
  • 過剰使用の可能性: アプリケーションのオーバーエンジニアリングを避けるために、ファクトリー メソッド パターンを慎重に使用することが重要です。単純なオブジェクトの作成は、多くの場合、ファクトリを必要とせずに直接処理できます。
  • テストの課題: ファクトリ ロジック自体のテストは、より複雑になる場合があります。

結論

これまで、Factory メソッドのデザイン パターンとは何か、そしてそれを実装する方法を学びました。この設計メカニズムの利点はかなり理解できたと思います。ファクトリ メソッドはツールキットとフレームワークに浸透しています。前述のドキュメントの例は、MacApp と ET++ での一般的な使用例です。

さらに読む : Java デザイン パターンのチュートリアル