『学習ノート』のJAVA設計モデル--工場方法モデル


          《        》      ,        :

一、工場方法モデルとは
     ファクトリメソッドモードもクラスに属する作成型モードは、マルチステートファクトリモードとも呼ばれる.ファクトリメソッドモデルの意味は、製品オブジェクトを作成するファクトリインタフェースを定義し、実際の作成作業をサブクラスに遅らせることです.コアファクトリクラスは製品の作成を担当しなくなり、コアクラスは抽象ファクトリの役割となり、特定のファクトリサブクラスが実現しなければならないインタフェースだけを担当する.このようなさらなる抽象化の利点は、ファクトリメソッドモデルが特定のファクトリロールを修正することなく、システムが新しい製品を導入できるようにすることである.
二、モードに含まれる役割とその職責
1.抽象ファクトリ(Creator)ロールファクトリメソッドモデルの核心であり、どのファクトリクラスもこのインタフェースを実現しなければならない.
2.具体的な工場(Concrete) Creator)ロールの具体的なファクトリクラスは、製品オブジェクトのインスタンス化を担当する抽象ファクトリの実装です.
3.すべてのインスタンスが共有する共通インタフェースを記述する抽象(Product)ロールファクトリメソッドモードによって作成されたすべてのオブジェクトの親.
4.特定のプロダクト(Concrete Product)ロールファクトリメソッドモードによって作成された特定のインスタンスオブジェクト.
     前回では簡単な工場モデルを学び、以下の具体的な工場Fruit Factoryを使用してすべての果物オブジェクトをインスタンス化しました.欠点は明らかです.新しい品種の果物が発生する必要がある場合、工場のgetFruit()方法を修正し、新しい品種の果物の論理判断と業務コードを加える必要があります.これはjavaの「オープン-クローズ」には極めて合わないということです.原則.
public class FruitFactory {
    /*
     * get  ,        
     */
     public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        if(type.equalsIgnoreCase("apple")) {
            return Apple.class.newInstance();
            
        } else if(type.equalsIgnoreCase("banana")) {
            return Banana.class.newInstance();
        } 
        /*
         *                               ,  :
         * else if(type.equalsIgnoreCase("pear")) {
         *         return Pear.class.newInstance();
         *    } 
         */
         else {
            System.out.println("          ");
            return null;
        }
    }
}

     次に、ファクトリメソッドモデルを使用して上記のファクトリを改善します.まず、ファクトリメソッドモデルではFruit Factoryが抽象ファクトリ(抽象クラスまたはインタフェースであってもよい)として設計されています.これは、特定の製品の作成を担当するのではなく、そのサブクラスによって実現される製品の作成作業を遅らせます.次に、具体的なコードを例に挙げます.
     抽象化されたFruit Factoryは、すべてのサブクラスが実装するインタフェースを宣言するためにのみ使用されます.
public interface FruitFactory {
    public Fruit getFruit();
}

     この抽象工場ができたら、りんごが必要になったらどうしますか.簡単です.アップルを生産する工場AppleFactoryを作成すればいいです.
public class AppleFactory implements FruitFactory{


    public Fruit getFruit(){
        return new Apple();
    }

}

     もし私たちがバナナが必要になったらどうしますか?相変わらず簡単で、バナナを生産する工場BananaFactoryを作ればいいです.
public class BananaFactory implements FruitFactory{


    public Fruit getFruit(){
        return new Banana();
    }

}

     今後、他にも多くの新しい品種の果物が追加される場合は、対応する果物を生産する工場を作成し、抽象的な工場Fruit Factoryのインタフェースを実現するだけで、どの果物が必要か、対応する工場のgetFruit()方法を呼び出して果物を得ることができます.これには、私たちがどれだけの果物を増やしても、メリットがあります.既存のコードを修正する必要がなく、対応する果物を生産する工場を1つ増やすだけで、「オープン-クローズ」の原則によく合っています.
三、工場方法モデルと簡単な工場モデルの比較
     工場方法モデルと単純工場モデルの構造的相違は明らかではない.工場メソッドクラスの核心は抽象的な工場クラスであり、簡単な工場モデルは核心を具体的なクラスに置く. ファクトリメソッドモデルに多態性ファクトリモデルという個別の名前があるのは,具体的なファクトリクラスに共通のインタフェースがあるか,あるいは共通の抽象的な親があるからである.システム拡張で新しいプロダクトオブジェクトを追加する必要がある場合、特定のオブジェクトと特定のファクトリオブジェクトを追加するだけで、既存のファクトリオブジェクトは変更する必要はありません.クライアントを変更する必要もありません.「オープン-クローズ」の原則によく合っています.単純ファクトリモデルは、新製品オブジェクトを追加した後、ファクトリメソッドを修正せざるを得ず、拡張性が悪い.     工場法モードが劣化すると,単純な工場モードに発展することができる.