logo

Шаблон фабричного методу

Шаблон Factory або Factory Method Pattern говорить це просто визначте інтерфейс або абстрактний клас для створення об’єкта, але дозвольте підкласам вирішити, який клас створити. Іншими словами, підкласи відповідають за створення екземпляра класу.

Патерн методу Factory також відомий як Віртуальний конструктор.

Перевага шаблону заводського дизайну

  • Шаблон Factory Method Pattern дозволяє суб-класам вибирати тип об’єктів для створення.
  • Це сприяє слабке зчеплення за рахунок усунення необхідності зв'язувати специфічні для програми класи в коді. Це означає, що код взаємодіє виключно з отриманим інтерфейсом або абстрактним класом, тому він працюватиме з будь-якими класами, які реалізують цей інтерфейс або розширюють цей абстрактний клас.

Використання шаблону заводського дизайну

  • Коли клас не знає, які підкласи потрібно буде створити
  • Коли клас хоче, щоб його підкласи вказували об’єкти, які потрібно створити.
  • Коли батьківські класи вибирають створення об'єктів для своїх підкласів.

UML для шаблону методу Factory

  • Ми збираємося створити абстрактний клас 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. 

завантажте цей приклад рахунку за електроенергію

Вихід