logo

ファクトリメソッドパターン

ファクトリ パターンまたはファクトリ メソッド パターンは、次のことを示します。 オブジェクトを作成するためのインターフェイスまたは抽象クラスを定義しますが、どのクラスをインスタンス化するかはサブクラスに決定させます。 言い換えれば、サブクラスはクラスのインスタンスを作成する責任があります。

ファクトリ メソッド パターンは、次のようにも呼ばれます。 仮想コンストラクター。

ファクトリーデザインパターンのメリット

  • ファクトリ メソッド パターンを使用すると、サブクラスは作成するオブジェクトのタイプを選択できます。
  • それは、 疎結合 アプリケーション固有のクラスをコードにバインドする必要がなくなるためです。つまり、コードは結果のインターフェイスまたは抽象クラスとのみ対話するため、そのインターフェイスを実装するクラスやその抽象クラスを拡張するクラスと連携して動作します。

ファクトリデザインパターンの使用法

  • どのサブクラスを作成する必要があるかクラスがわからない場合
  • クラスが、そのサブクラスで作成されるオブジェクトを指定することを必要とする場合。
  • 親クラスがそのサブクラスに対するオブジェクトの作成を選択したとき。

ファクトリ メソッド パターンの UML

  • Plan 抽象クラスと、Plan 抽象クラスを拡張する具象クラスを作成します。次のステップとして、ファクトリ クラス GetPlanFactory が定義されます。
  • GenerateBill クラスは GetPlanFactory を使用して Plan オブジェクトを取得します。必要なオブジェクトのタイプを取得するために、情報 (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) を GetPalnFactory に渡します。

電気代の計算 : ファクトリーメソッドの実世界の例

ステップ1: Plan 抽象クラスを作成します。

 import java.io.*; abstract class Plan{ protected double rate; abstract void getRate(); public void calculateBill(int units){ System.out.println(units*rate); } }//end of Plan class. 

ステップ2: Plan 抽象クラスを拡張する具象クラスを作成します。

 class DomesticPlan extends Plan{ //@override public void getRate(){ rate=3.50; } }//end of DomesticPlan class. 
 class CommercialPlan extends Plan{ //@override public void getRate(){ rate=7.50; } }//end of CommercialPlan class. 
 class InstitutionalPlan extends Plan{ //@override public void getRate(){ rate=5.50; } }//end of InstitutionalPlan class. 

ステップ 3: GetPlanFactory を作成して、指定された情報に基づいて具象クラスのオブジェクトを生成します。

 class GetPlanFactory{ //use getPlan method to get object of type Plan public Plan getPlan(String planType){ if(planType == null){ return null; } if(planType.equalsIgnoreCase('DOMESTICPLAN')) { return new DomesticPlan(); } else if(planType.equalsIgnoreCase('COMMERCIALPLAN')){ return new CommercialPlan(); } else if(planType.equalsIgnoreCase('INSTITUTIONALPLAN')) { return new InstitutionalPlan(); } return null; } }//end of GetPlanFactory class. 

ステップ 4: GetPlanFactory を使用して、プランの種類 (DOMESTICPLAN、COMMERCIALPLAN、または INSTITUTIONALPLAN) などの情報を渡して具体的なクラスのオブジェクトを取得し、請求書を生成します。

 import java.io.*; class GenerateBill{ public static void main(String args[])throws IOException{ GetPlanFactory planFactory = new GetPlanFactory(); System.out.print('Enter the name of plan for which the bill will be generated: '); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String planName=br.readLine(); System.out.print('Enter the number of units for bill will be calculated: '); int units=Integer.parseInt(br.readLine()); Plan p = planFactory.getPlan(planName); //call getRate() method and calculateBill()method of DomesticPaln. System.out.print('Bill amount for '+planName+' of '+units+' units is: '); p.getRate(); p.calculateBill(units); } }//end of GenerateBill class. 

この電気料金請求書の例をダウンロード

出力