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.
изтеглете този пример за сметка за електричество