抽象的な工場パターン


抽象ファクトリーパターンは、スーパーファクトリーの周りに他のファクトリーを作成することです。ギガファクトリーは他の工場の工場としても知られています。このタイプのデザイン パターンは創造的なパターンであり、オブジェクトを作成するための最適な方法を提供します。


抽象ファクトリ パターンでは、インターフェイスは、クラスを明示的に指定せずに関連オブジェクトを作成する責任のあるファクトリです。生成された各ファクトリは、ファクトリ パターンに従ってオブジェクトを提供できます。

概要

目的: 具象クラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します。

主に解決するもの: 主にインターフェース選択の問題を解決します。

いつ使用するか: システムの製品には複数の製品ファミリーがあり、システムはそのうちの 1 つのファミリーの製品のみを消費します。

解決方法: 製品ファミリー内に複数の製品を定義します。

キーコード: 1つの工場内の複数の類似製品の集約。

適用例: 仕事の後、いくつかのパーティーに参加するには、ビジネス服(一式セット、特定の製品のシリーズ)、ファッション服(一式セット、シリーズ)などの服を2セット以上持っている必要があります家族向けであっても、ビジネス用婦人服、ビジネス用紳士服、ファッショナブルな婦人服、ファッショナブルな紳士服が存在する場合があります。これらも完全なセット、つまり一連の特定の商品です。ある状況を想定してください (現実には存在しません。そうでなければ共産主義に入る方法はありませんが、抽象的な工場モデルを説明するのに役立ちます)。自宅の特定のワードローブ (コンクリート工場) には特定の種類のものしか保管できません。このような服(セット、特定の製品のシリーズ)のセットを手に取るたびに、このワードローブから自然に取り出すことになります。 OO 思考を使用して、すべてのワードローブ (具体的な工場) はワードローブ (抽象的な工場) であり、衣服の各セットには特定のトップス (特定の製品)、パンツ (特定の製品) 製品が含まれており、これらの具体的なトップスは実際にはトップス (特定の製品) であることを理解します。抽象的な製品)、具体的なパンツもパンツ(別の抽象的な製品)です。

利点: 製品ファミリー内の複数のオブジェクトが連携して動作するように設計されている場合、クライアントは常に同じ製品ファミリー内のオブジェクトのみを使用することが保証されます。

欠点: シリーズの特定の製品を追加するには、特定の製品だけでなく抽象的な Creator にもコードを追加する必要があります。

使用シナリオ: 1. QQ スキンの変更、セット全体を一緒に変更します。 2. さまざまなオペレーティング システム用のプログラムを生成します。

注: 製品ファミリーの拡張は困難ですが、製品レベルの拡張は簡単です。

実装

ShapeおよびColorインターフェースと、これらのインターフェースを実装するエンティティクラスを作成します。次のステップは、抽象ファクトリ クラス AbstractFactory を作成することです。次に、ファクトリ クラス ShapeFactoryColorFactory を定義します。どちらも AbstractFactory を拡張します。次に、ファクトリ クリエーター/ジェネレーター クラス FactoryProducer を作成します。

AbstractFactoryPatternDemo、私たちのデモクラスはFactoryProducerを使用してAbstractFactoryオブジェクトを取得します。必要なオブジェクトのタイプを取得するために、形状情報 Shape (CIRCLE / RECTANGLE / SQUARE) を AbstractFactory に渡します。また、必要なオブジェクトのタイプを取得するために、色情報 Color (RED / GREEN / BLUE) を AbstractFactory に渡します。

abstractfactory_pattern_uml_diagram.jpg

ステップ 1

シェイプのインターフェースを作成します。

Shape.java

public interface Shape {
   void draw();
}

ステップ 2

インターフェースを実装するエンティティクラスを作成します。

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

ステップ 3

色のインターフェイスを作成します。

Color.java

public interface Color {
   void fill();
}

ステップ 4

インターフェースを実装するエンティティクラスを作成します。

Red.java

public class Red implements Color {

   @Override
   public void fill() {
      System.out.println("Inside Red::fill() method.");
   }
}

Green.java

public class Green implements Color {

   @Override
   public void fill() {
      System.out.println("Inside Green::fill() method.");
   }
}

Blue.java

public class Blue implements Color {

   @Override
   public void fill() {
      System.out.println("Inside Blue::fill() method.");
   }
}

ステップ5

ColorオブジェクトとShapeオブジェクトの抽象クラスを作成してファクトリを取得します。

AbstractFactory.java

public abstract class AbstractFactory {
   abstract Color getColor(String color);
   abstract Shape getShape(String shape) ;
}

ステップ 6

AbstractFactory を拡張して、指定された情報に基づいてエンティティ クラスのオブジェクトを生成するファクトリ クラスを作成します。

ShapeFactory.java

public class ShapeFactory extends AbstractFactory {
	
   @Override
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }		
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
   
   @Override
   Color getColor(String color) {
      return null;
   }
}

ColorFactory.java

public class ColorFactory extends AbstractFactory {
	
   @Override
   public Shape getShape(String shapeType){
      return null;
   }
   
   @Override
   Color getColor(String color) {
      if(color == null){
         return null;
      }		
      if(color.equalsIgnoreCase("RED")){
         return new Red();
      } else if(color.equalsIgnoreCase("GREEN")){
         return new Green();
      } else if(color.equalsIgnoreCase("BLUE")){
         return new Blue();
      }
      return null;
   }
}

ステップ 7

形状または色の情報を渡してファクトリを取得するファクトリ クリエーター/ジェネレータ クラスを作成します。

FactoryProducer.java

public class FactoryProducer {
   public static AbstractFactory getFactory(String choice){
      if(choice.equalsIgnoreCase("SHAPE")){
         return new ShapeFactory();
      } else if(choice.equalsIgnoreCase("COLOR")){
         return new ColorFactory();
      }
      return null;
   }
}

ステップ 8

FactoryProducer を使用して AbstractFactory を取得し、型情報を渡してエンティティ クラスのオブジェクトを取得します。

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {

      //获取形状工厂
      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

      //获取形状为 Circle 的对象
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //调用 Circle 的 draw 方法
      shape1.draw();

      //获取形状为 Rectangle 的对象
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //调用 Rectangle 的 draw 方法
      shape2.draw();
      
      //获取形状为 Square 的对象
      Shape shape3 = shapeFactory.getShape("SQUARE");

      //调用 Square 的 draw 方法
      shape3.draw();

      //获取颜色工厂
      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

      //获取颜色为 Red 的对象
      Color color1 = colorFactory.getColor("RED");

      //调用 Red 的 fill 方法
      color1.fill();

      //获取颜色为 Green 的对象
      Color color2 = colorFactory.getColor("Green");

      //调用 Green 的 fill 方法
      color2.fill();

      //获取颜色为 Blue 的对象
      Color color3 = colorFactory.getColor("BLUE");

      //调用 Blue 的 fill 方法
      color3.fill();
   }
}

ステップ 9

出力を確認します。

りー