JAva設計モード(抽象ファクトリモード)


従来の3つの工場モデルでは、コアはすべて工場クラスであり、1つの工場クラスがすべての製品の作成作業を担当しており、製品のツリー構造が拡張する必要がある場合は、工場クラスで新しい製品の作成機能を追加しなければならない.これは明らかに開閉原則に反している--拡張時に元のコードを修正することはできない.
  この問題を解決するために、抽象的な工場モデルを採用することができます.すなわち、製品クラスに似た工場クラス構造を構築し、各製品に具体的な工場クラスを提供することができます.
  まず、次のコードで製品を作成するためのインタフェースメソッドproduce()を提供するファクトリクラスのインタフェースを作成します.
  ●抽象ファクトリモード親
public interface Farm{

  public Animal produce();
}

  ●3つの工場クラスを作成する
//Pig   
public class FarmPig implements Farm{

  public Animal produce(){

  return new Pig();
}
}

//Chicken   
public class FarmChicken implements Farm{

  public Animal produce(){

  return new Chicken();
}
}

//Sheep   
public class FarmSheep implements Farm{

  public Animal produce(){

  return new Sheep();
}
}  

  これにより、3つの製品を作成する必要がある場合は、対応する製品のファクトリクラスのみを作成して、それぞれの製品オブジェクトを作成できます.テストプログラムは次のとおりです.
 public class FarmTest{

  public static void test(int count1,int count2,int count3){

  //   
  Farm farm1 = new FarmPig();
  Animal animal1 = farm1.produce();
  //   
  Farm farm2 = new FarmChicken();
  Animal animal2 = farm2.produce();
  //   
  Farm farm3 = new FarmSheep();
  Animal animal3 = farm3.produce();

  //    
  int money1 = animal1.sale()*count1;
  int money2 = animal2.sale()*count2;
  int money3 = animal3.sale()*count3;
  System.out.println("Farm    :" + money1);
  System.out.println("Farm    :" + money2);
  System.out.println("Farm    :" + money3);

  //     
  int sum = money1 + money2 + money3;
  System.out.println("Farm   :" + sum);

}

  public static void main(String[] args){
 
  FarmTest.test(20,1000,50);
}
}

  ●抽象ファクトリモードの使用時期
  以上の拡張説明から分かるように、抽象工場は製品構造が変化したり拡張する可能性がある製品の作成に適しているが、実際には、私たちの多くのプログラムは将来のメンテナンスに拡張の余地を残しなければならない.これは開閉の原則に合致している.ほとんどの場合、抽象的な工場モデルを採用します.もちろん、これは通常の工場方法が適用されていないシーンを示すものではなく、製品構造が固定的で簡単であれば、前節のSwingの工場BorderFactoryに示すように使用することができます.