ファクトリパターン

Factoryパターン(ファクトリパターン)は、Javaは、最も一般的に使用されるデザインパターンの一つです。デザインパターンのこのタイプのオブジェクトを作成するための最良の方法を提供し、スキーマを作成します属します。

ファクトリモードでは、我々はあなたがオブジェクトを作成するときに論理を作成するには、クライアントを公開していないだろう、と共通のインターフェースを使用して新しく作成されたオブジェクトを指すように。

入門

意図:サブクラスは、クラスファクトリのどのインスタンスを決定させ、定義されたオブジェクトのインターフェイスを作成するために、工場出荷時のモデルを、それは、サブクラスを作成するためのプロセスを遅らせるように

主に解決するために:インターフェースオプションの主な問題を。

ときに使用する:あなたは、私たちは間違いなく計画異なる条件で異なるインスタンスを作成するとき。

解決方法:サブクラスは、ファクトリインタフェースを実装してみましょう、それが返品された製品の抽象的です。

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

応用例:  1、あなたが車を必要とする、あなたは工場内から直接拾うことができ、車はそれを行う方法で、チューブを持つことなく、車の中、この特定の実装。2は、Hibernateの変更は、単にデータベースの方言を変更すると駆動が可能。

利点:  1、呼び出し側はそれにその名前を知って、オブジェクトを作成したかったのです。2、高いスケーラビリティ、あなたがいる限りファクトリクラスの拡張ができるように、製品を追加したい場合。図3に示すように、遮蔽製品の具体的な実現は、発信者のみインターフェース製品に関する

短所:たび製品増加、コンクリート工場クラスおよび目的を達成する必要性を増加させる、そのようなシステム増加のクラスの数が指数関数的にその、ある程度、システムの複雑さを増加させるだけでなく、システムの特定のクラスを増加させます依存性。これは良いことではありません。

使用シナリオ:  1、ロガー:レコードは、ローカルのハードディスクに、ユーザがどこかにログインするために選択することができ、リモートサーバーなどのシステムイベントを、記録することができます。2、データベースアクセス、ユーザーがデータベースを使用して、データベースが変更を持っていることがあり、最終的なシステムの種類を知りません。3、サーバーに接続するためのフレームワークを設計し、あなたは、「POP3」、「IMAP」3プロトコルを必要とし 、「HTTP」をこれらの3つの製品には、クラスとして、共通のインタフェースを実装することができます。

注意:このクラスは、複雑なオブジェクトを生成する必要がある任意の場所にパターンを作成するために、あなたはFactory Methodパターンを使用することができます。注意すべき地域の一つは、工場出荷時のモード、および単純なオブジェクトに適した複雑なオブジェクトは、特に、工場モデルを使用せずに、新しいによって作成されたオブジェクトを完了するためにのみ必要があるということです。工場出荷時のモードは、それがファクトリクラスを導入する必要がある場合、それはシステムの複雑さを増加します。

実現

私たちは、作成する  シェイプ  インタフェースと実装の  形状  エンティティクラスインターフェイスを。次のステップは、ファクトリクラスの定義です  ShapeFactory

FactoryPatternDemoは、私たちのデモクラスには、使用しています  ShapeFactoryを  取得するには  シェイプ  オブジェクトを。それに  ShapeFactory  転送情報(CIRCLE / RECTANGLE / SQUARE)、それはオブジェクトの種類を取得する必要があります。

図ファクトリパターンUML

ステップ1

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

Shape.java

パブリック インターフェイス形状{
    ボイドドロー(); 
}

ステップ2

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

Rectangle.java

パブリック クラス長方形は実装形{ 
 
   @Override 
   公共 ボイドドロー(){ 
      System.out.printlnは( "インサイド長方形:: draw()メソッドを。" ); 
   } 
}

Square.java

パブリック クラススクエアは実装形{ 
 
   @Override 
   公共 ボイドドロー(){ 
      System.out.printlnは( "インサイド・スクエア:: draw()メソッドを。" ); 
   } 
}

Circle.java

パブリック クラスサークルは実装形{ 
 
   @Override 
   公共 ボイドドロー(){ 
      System.out.printlnは( "インサイド・サークル:: draw()メソッドを。" ); 
   } 
}

ステップ3

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

ShapeFactory.java

パブリック クラスShapeFactory { 
    
   // 使用getShape方法获取形状类型的对象
   公共形状getShape(文字列形状タイプ){
       場合(形状タイプ== NULL ){
          戻り ヌル
      }         
      であれば(shapeType.equalsIgnoreCase( "CIRCLE" )){
          戻り 新しい)(サークル。
      } そう であれば(shapeType.equalsIgnoreCase( "RECTANGLE" )){
          戻り 新しい)(長方形を、
      } それ以外の 場合(shapeType.equalsIgnoreCase( "SQUARE" )){
          返す 新しいです平方(); 
      } 
      戻り ヌル
   } 
}

ステップ4

この機能を使用して、オブジェクトが型情報を渡すことにより、エンティティクラスを取得しました。

FactoryPatternDemo.java

パブリック クラスFactoryPatternDemo { 
 
   公共 静的 ボイドメイン(文字列[]引数){ 
      ShapeFactory shapeFactory = 新しい新しいShapeFactory(); 
 
      // 円のオブジェクトを取得し、延伸方法呼び出す 
      形状Shape1 = shapeFactory.getShape(「サークル」); 
 
      // drawメソッドの呼び出しのサークル
      shape1.drawを(); 
 
      // 四角形のオブジェクトを取得し、その後のそのdrawメソッドを呼び出す 
      形Shape2 = shapeFactory.getShape( "RECTANGLE" ); 
 
      // 矩形のdrawメソッドを呼び出す
      shape2.drawを(); 
 
      / / スクエアオブジェクトを取得し、そのdrawメソッドを呼び出す 
      形状shape3 = shapeFactory.getShape( "SQUARE"を); 
 
      //ドローコールスクエアの方法
      shape3.draw(); 
   } 
}

ステップ5

プログラム、出力の実装:

円の内側:: draw()メソッド。
長方形の内側:: draw()メソッド。
スクエア:: draw()メソッドの内部。

 

その他の関連記事