logo

Образец на фабричен метод

Factory Pattern или Factory Method Pattern казва това просто дефинирайте интерфейс или абстрактен клас за създаване на обект, но оставете подкласовете да решат кой клас да инстанцира. С други думи, подкласовете са отговорни за създаването на екземпляра на класа.

Моделът на фабричния метод е известен също като Виртуален конструктор.

Предимство на модела на фабричния дизайн

  • Factory Method Pattern позволява на подкласовете да избират типа обекти за създаване.
  • Той насърчава хлабаво свързване като елиминира необходимостта от свързване на специфични за приложението класове в кода. Това означава, че кодът взаимодейства единствено с резултантния интерфейс или абстрактен клас, така че да работи с всички класове, които имплементират този интерфейс или които разширяват този абстрактен клас.

Използване на модел на фабричен дизайн

  • Когато даден клас не знае какви подкласове ще трябва да създаде
  • Когато даден клас иска неговите подкласове да определят обектите, които да бъдат създадени.
  • Когато родителските класове избират създаването на обекти към своите подкласове.

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: Генерирайте Bill, като използвате 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. 

изтеглете този пример за сметка за електричество

Изход