Latest web development tutorials

Abstract Factoryパターン

抽象ファクトリー(Abstract Factoryパターン)は、他の植物のスーパー植物の周りに作成されます。 植物はまた、スーパー、他の工場の工場として知られています。 デザインパターンのこのタイプのオブジェクトを作成するための最良の方法を提供する、スキーマを作成属します。

Abstract Factoryパターンでは、インターフェイスが明示的にクラスを指定せずに、プラント関連オブジェクトを作成するための責任があります。 生成された各オブジェクトには、工場によると、工場モデルを提供することができます。

入門

意図:その具象クラスを指定せずに、関連または依存オブジェクト・インターフェースのシリーズを作成します。

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

ときに使用する:システム製品は、複数の製品ファミリを持ち、消費者製品の中で家族の唯一のシステム。

修正方法:内部の製品ファミリに、複数の製品を定義します。

キーコード:工場の集約複数の同様の製品。

アプリケーション例は:仕事は、いくつかの会議に参加するために、服の2以上のセットが存在しなければならないこと、たとえば、でも家族のためのビジネススーツ(完全なセット、特定の製品のシリーズ)、ファッションドレス(完全なセット、特定の製品のシリーズ)、あなたは、彼らはまた、完全なセット、特定の製品のすなわちシリーズです、ビジネス女性、ビジネスメンズ、レディスファッション、メンズファッションを有していてもよいです。状況を仮定(現実には存在しない、あるいは、ない共産主義が、Abstract Factoryパターンの説明を支持して)、あなたの家、1ワードローブ(コンクリート工場)で一つだけを保存することができます服(完全なセット、特定の製品のシリーズ)、あなたはクローゼットから服のこのセットを取るたびに自然に取り出しました。 OOが理解することを考えて、すべてのワードローブ(コンクリートプラント)は、ワードローブクラス(抽象工場)1、および特定のジャケット(特定の製品)を含む衣類やの各1セット、パンツ(特異的であり、 )製品には、これらは、実際には特定のシャツジャケット(抽象製品)、特定のパンツはパンツです(別の抽象製品)です。

長所:製品ファミリより多くのオブジェクトが一緒に動作するように設計されているとき、私たちはクライアントは常にちょうど同じ製品ファミリのオブジェクトを使用していることを確認することができます。

短所:拡張製品ファミリーは非常に困難であるが、抽象的なクリエイターリガコードの両方で、製品の範囲を増加させるだけでなく、内部に特定のコードを追加します。

使用シナリオ:1、皮膚のためのQQ、一緒に変化のセット。2、異なるオペレーティング・システム・プロシージャを生成します。

注:拡張された製品ファミリは、製品レベルを拡張することは容易、困難です。

実現

当社はこれらの事業体の形状色のインタフェースと実装クラスのインターフェイスを作成します。 次のステップは、抽象ファクトリクラスAbstractFactoryを作成することです その後、ファクトリクラスShapeFactoryColorFactoryを定義し、この2つのクラスは、工場AbstractFactoryを拡大しています その後、工場出荷時のクリエーター/ビルダークラスFactoryProducerを作成します

AbstractFactoryPatternDemo、AbstractFactoryオブジェクトを取得しFactoryProducerを使用して、私たちのデモクラス。 それは、オブジェクトの型を取得する必要がある、AbstractFactoryに情報シェイプ(CIRCLE / RECTANGLE / SQUARE)を形作る渡します。 それはまた、オブジェクトの種類を取得する必要があり、AbstractFactoryに色情報の色 (赤/緑/青)を通過します。

Abstract FactoryパターンUMLダイアグラム

ステップ1

形状を作成するためのインターフェイス。

Shape.java

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

ステップ2

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

Rectangle.java

パブリッククラス長方形は{Shapeを実装します

   @Override
   公共ボイドドロー(){
      System.out.println( "内部長方形::ドロー()メソッド。");
   }
}

Square.java

パブリッククラススクエア{Shapeを実装します

   @Override
   公共ボイドドロー(){
      System.out.println( "インサイド広場::ドロー()メソッド。");
   }
}

Circle.java

パブリッククラスサークル{Shapeを実装します

   @Override
   公共ボイドドロー(){
      System.out.println( "内部サークル::ドロー()メソッド。");
   }
}

ステップ3

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

Color.java

パブリックインターフェイスカラー{
   空間充填();
}

ステップ4

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

Red.java

パブリッククラスレッドカラーを{実装します

   @Override
   公共ボイドフィル(){
      System.out.println( "インサイドレッド::フィル()メソッド。");
   }
}

Green.java

パブリッククラスグリーンカラーを{実装します

   @Override
   公共ボイドフィル(){
      System.out.println( "内部グリーン::フィル()メソッド。");
   }
}

Blue.java

パブリッククラスブルーカラーを{実装します

   @Override
   公共ボイドフィル(){
      System.out.println( "内部ブルー::フィル()メソッド。");
   }
}

ステップ5

色の抽象クラスを作成し、工場を取得するには、オブジェクト形状。

AbstractFactory.java

パブリック抽象クラスAbstractFactory {
   抽象的な色GETCOLOR(文字列の色)。
   抽象的な形getShape(String型の形状)。
}

ステップ6

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

ShapeFactory.java

パブリッククラスShapeFactoryはAbstractFactoryを{拡張します
	
   @Override
   公共シェイプgetShape(文字列形状タイプ){
      場合(形状タイプ== nullの){
         ヌルを返します。
      }		
      場合(shapeType.equalsIgnoreCase( "CIRCLE")){
         新しいサークルを返します();
      }エルス場合(shapeType.equalsIgnoreCase(「RECTANGLE ")){
         新しいRectangleを返します();
      }エルス場合(shapeType.equalsIgnoreCase( "SQUARE")){
         新しい広場を返します();
      }
      ヌルを返します。
   }
   
   @Override
   色GETCOLOR(文字列の色){
      ヌルを返します。
   }
}

ColorFactory.java

パブリッククラスColorFactoryはAbstractFactoryを{拡張します
	
   @Override
   公共シェイプgetShape(文字列形状タイプ){
      ヌルを返します。
   }
   
   @Override
   色GETCOLOR(文字列の色){
      {(色== null)の場合
         ヌルを返します。
      }		
      場合(color.equalsIgnoreCase( "RED")){
         新しいレッドを返します();
      }エルス場合(color.equalsIgnoreCase( "GREEN")){
         返す新しいグリーン();
      }エルス場合(color.equalsIgnoreCase( "BLUE")){
         )(新しいブルーを返します。
      }
      ヌルを返します。
   }
}

ステップ7

工場を得るために、形状や色情報を通過し、工場出荷時の作成者/ビルダーのカテゴリを作成します。

FactoryProducer.java

パブリッククラスFactoryProducer {
   パブリック静的AbstractFactoryのgetFactory(文字列の選択){
      (choice.equalsIgnoreCase( "SHAPE")){場合
         新しいShapeFactoryを返します();
      }エルス場合(choice.equalsIgnoreCase( "COLOR")){
         新しいColorFactoryを返します();
      }
      ヌルを返します。
   }
}

ステップ8

エンティティタイプの情報を渡すことによって、クラスのオブジェクトを取得するために、AbstractFactoryを取得するにはFactoryProducerを使用してください。

AbstractFactoryPatternDemo.java

パブリッククラスAbstractFactoryPatternDemo {
   公共の静的な無効メイン(文字列[] args){

      //ファクトリの形状AbstractFactory shapeFactory = FactoryProducer.getFactory(「SHAPE」)を取得します。

      //取得したオブジェクトの形状サークルシェイプshape1 = shapeFactory.getShape( "CIRCLE");

      //)(shape1.drawサークルのdrawメソッドを呼び出します。

      //オブジェクトの形状長方形の形状shape2 = shapeFactory.getShape(「RECTANGLE」)を取得します。

      // shape2.draw長方形()のdrawメソッドを呼び出します。
      
      //オブジェクトの形状スクエアシェイプshape3を取得= shapeFactory.getShape( "SQUARE");

      //)(drawメソッドスクエアshape3.drawを呼び出します。

      //取得した色工場AbstractFactory colorFactory = FactoryProducer.getFactory( "COLOR");

      //オブジェクトの色を取得します赤い色のカラー1 = colorFactory.getColor(「RED」)です。

      //)(fillメソッドレッドcolor1.fillを呼び出します。

      //取得したオブジェクトの色グリーン色カラー2 = colorFactory.getColor( "グリーン");

      //コールグリーンフィル方法color2.fill();

      //取得したオブジェクトの色ブルーカラーcolor3 = colorFactory.getColor( "BLUE");

      //)(fillメソッドブルーcolor3.fillを呼び出します。
   }
}

ステップ9

出力を確認します。

サークル::ドロー()メソッド内。
長方形の内側::ドロー()メソッド。
スクエア::ドロー()メソッド内。
レッドインサイド::()メソッドを埋めます。
グリーン::フィル()メソッド内。
ブルーインサイド::()メソッドを埋めます。