Javaスタティックファクトリ

3511 ワード

【何が】
一、定義
ファクトリ:オブジェクト向けプログラミングでは、ファクトリは通常、他のオブジェクトを作成するためのオブジェクトです.工場は構造方法の抽象であり,異なる分配スキームを実現するために用いられる.
ファクトリメソッドモデル(英語:Factory method pattern)は、「ファクトリ」の概念を実現したオブジェクト向け設計モデルである.他の作成モードと同様に、オブジェクトの特定のタイプを指定せずにオブジェクトを作成する問題も処理されます.ファクトリメソッドモードの本質は、「オブジェクトを作成するインタフェースを定義しますが、このインタフェースを実装するクラスにどのクラスをインスタンス化するかを決定させます.ファクトリメソッドはクラスのインスタンス化をサブクラスに延期します.」
二、例を挙げる
ファクトリモードは、異なるパラメータに基づいてオブジェクトを作成します.たとえば、工場で乗用車を作成します.もし私たちがアウディがほしいなら、工場は私たちのためにアウディを生産します.もし私たちがBMWが必要なら、工場は私たちのためにBMWを生産します.工場は異なるパラメータに基づいて、私たちに異なるものを提供します.これらの作成プロセスはインスタンス化です.つまり、オブジェクトのインスタンス化プロセスをカプセル化し、クラスを特定してインスタンス化します.これがファクトリモードです.
【どうするか】
次の2つのキーコードから見ると、静的工場のコードを使用してマネージャークラスと具体的な実装クラスを緊密に結合していない.生産された自動車の種類が多ければ、マネージャーは常に変化し、マネージャークラスは常に修正され、静的工場のコードを使用して、すべてのインスタンス化を1つの工場クラスにカプセル化する.今後は、Managerというクラスだけでなく工場クラスを呼び出すことができるかもしれませんが、追加の方法でも工場を呼び出すことができます.
一、静的工場のコードを使用していない:
  • Manager.java
  •  public class Manager {
             public static Car CreatCar(String type){
             Car car = null;
              if(type.equals("audi")){
                  car=new AuDi();
              }else if(type.equals("baoma")){
                 car=new BaoMa();
              }else if(type.equals("suv")){
                 car=new Suv();
              }
             car.Prepare();
             car.Install();
             car.Color();
             return car;
         }
     }
    

    二、静的工場のコードを使用する:
  • Manager.java
  • public class Manager {
          Car car = null;
          public  Car CreatCar(String type){
              car=CarFactory.getCarInstance(type);
              car.Prepare();
              car.Install();
              car.Color();
              return car;
          }    
     }
    
  • CarFactory.java
  • public class CarFactory {
           public static Car getCarInstance(String type){
              Car carInstance = null;
              if(type.equals("audi")){
                  carInstance=new AuDi();
              }else if(type.equals("baoma")){
                  carInstance=new BaoMa();
              }else if(type.equals("suv")){
                  carInstance=new Suv();
              }
            return carInstance;
         }
     }
    

    【なぜ】
    静的ファクトリモードを使用する理由は、次の点です.
    第一に、静的工場法は構造関数が自由に命名できない制限を突破することができ、異なる工場法に対して異なる会意の名前を採用することができ、プログラムがより良い可読性を持っている.JAVAプラットフォームライブラリのjava.text.FormatのサブクラスNumberFormatにはgetInstance(),getPrecentInstance(),getCurrencyInstatnce()などの静的メソッドがあり,異なる名前で特定のオブジェクトを生成する.
    第二に、静的ファクトリメソッドはオブジェクトを生成するために使用され、どのようなタイプのオブジェクトを生成するかに制限はありません.これは、元の戻りタイプまたは元の戻りタイプのサブタイプを返すだけで、java.util集合フレームワークのようなプログラム設計と使用の柔軟な行が増加することを意味します.これにより、パッケージの目的をよりよく達成することができます.APIの数とユーザーの使用の難しさを低減し、java.util.Clonectionsは集合フレームワークの補助クラスであり、既存の集合クラスをさらにカプセル化し、いくつかの同期の集合を生成し、変更できないビューである.いずれも静的工場法で実現されており,方法内部の実現クラスについては完全にカプセル化されている.インタフェースを使用してプログラミングを強制します.
    第三に、静的工場法で作成されたオブジェクトはコンパイル時に存在せず、動的にオブジェクトを作成し、放射線を採用し、SPRINGのようなIOCコンテナを回転させることができる.最も典型的な例はspiサービスプロバイダフレームワークであり、Service Provider Iframeは実行時にオブジェクトを生成するためのフレームワークであり、オブジェクトの作成と使用の分離を達成し、オブジェクトの顧客とオブジェクトの間のデカップリングであり、プログラムの柔軟性と拡張性を高める.spiが動的にオブジェクトを作成できる以上、どのメカニズムを使用してオブジェクトを作成するか、オブジェクトを作成する根拠は何か、spiは統一的な登録メカニズムが必要であり、作成するオブジェクトについてはXMLファイルで構成すべきであり、その時、文字列を1つ提供すれば、その文字列で構成されたオブジェクトを作成することができる.
    【欠点】
  • 静的方法では,CarFactoryが継承されるとgetCarが書き換えられないという欠点がある.
  • 我々は一般的にコンストラクション関数を用いてインスタンス化対象を行っているが,静的工場の手法を用いてインスタンス化を行うとインスタンス化とコンストラクション関数のインスタンス化が異なるため,使用難易度が増加し,一般的には比較的明確なネーミングを採用し,使用者が静的手法を使用したことを一目瞭然に知ることができるようにしている.
  • 例の特定のクラスのコンストラクション関数式がプライベートである場合、エラーが発生します.