工場出荷時のパターン


ファクトリー パターンは、Java で最も一般的に使用されるデザイン パターンの 1 つです。このタイプのデザイン パターンは創造的なパターンであり、オブジェクトを作成するための最適な方法を提供します。

ファクトリ パターンでは、オブジェクトの作成時に作成ロジックをクライアントに公開せず、共通のインターフェイスを使用して新しく作成されたオブジェクトを指します。

はじめに

目的: オブジェクトを作成するためのインターフェイスを定義し、そのサブクラスにどのファクトリ クラスをインスタンス化するかを決定させます。ファクトリ パターンは、サブクラスが作成されるまで作成プロセスを遅らせます。

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

いつ使用するか: 異なる条件下で異なるインスタンスを作成することを明示的に計画している場合。

解決方法: そのサブクラスにファクトリインターフェイスを実装させ、抽象プロダクトを返します。

キーコード: 作成プロセスはそのサブクラスで実行されます。

応用例: 1. 車が必要な場合、車の製造方法や車内の具体的な実装を気にすることなく、工場から直接受け取ることができます。 2. Hibernate データベースを変更するには、方言とドライバーを変更するだけです。

利点: 1. 呼び出し元がオブジェクトを作成したい場合、必要なのはその名前だけです。 2. 高い拡張性 製品を追加する場合は、ファクトリ クラスを拡張するだけで済みます。 3. 製品の特定の実装をシールドすると、呼び出し側は製品インターフェイスのみを気にするようになります。

短所: 製品を追加するたびに、特定のクラスとオブジェクト実装ファクトリーを追加する必要があります。これにより、システム内のクラスの数が 2 倍になり、システムの複雑さがある程度増加し、システムの具象クラスへの依存関係。これは良いことではありません。

使用シナリオ: 1. ログレコーダー: 記録はローカルハードディスク、システムイベント、リモートサーバーなどに記録されます。ユーザーはログを記録する場所を選択できます。 2. 最終システムでどのタイプのデータベースが使用されるかユーザーがわからない場合、およびデータベースが変更される可能性がある場合のデータベース アクセス。 3. サーバーに接続するためのフレームワークの設計には、「POP3」、「IMAP」、「HTTP」の 3 つのプロトコルが必要です。これら 3 つは、インターフェースを統合するための製品カテゴリとして使用できます。

注: クラス作成パターンとして、ファクトリ メソッド パターンは、複雑なオブジェクトを生成する必要がある場合どこでも使用できます。注意すべき点の 1 つは、複雑なオブジェクトはファクトリ パターンの使用に適しているのに対し、単純なオブジェクト、特に new によってのみ作成できるオブジェクトにはファクトリ パターンを使用する必要がないということです。ファクトリ パターンを使用する場合は、ファクトリ クラスを導入する必要があり、システムの複雑さが増加します。

実装

ShapeインターフェースとShapeインターフェースを実装するエンティティクラスを作成します。次のステップは、ファクトリ クラス ShapeFactory を定義することです。

FactoryPatternDemo、私たちのデモクラスはShapeFactoryを使用してShapeオブジェクトを取得します。必要なオブジェクトのタイプを取得するために、情報 (CIRCLE / RECTANGLE / SQUARE) を ShapeFactory に渡します。

工厂模式的 UML 图

ステップ 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

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

ShapeFactory.java

public class ShapeFactory {
	
   //使用 getShape 方法获取形状类型的对象
   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;
   }
}

ステップ 4

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

FactoryPatternDemo.java

public class FactoryPatternDemo {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      //获取 Circle 的对象,并调用它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");

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

      //获取 Rectangle 的对象,并调用它的 draw 方法
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //调用 Rectangle 的 draw 方法
      shape2.draw();

      //获取 Square 的对象,并调用它的 draw 方法
      Shape shape3 = shapeFactory.getShape("SQUARE");

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

ステップ 5

出力を確認します。

りー