דפוס מפעל או דפוס שיטת מפעל אומר שפשוט הגדירו ממשק או מחלקה אבסטרקטית ליצירת אובייקט אבל תן לתת-מחלקות להחליט איזו מחלקה להפעיל. במילים אחרות, תת-מחלקות אחראיות ליצור את המופע של המחלקה.
דפוס שיטת המפעל ידוע גם בשם קונסטרוקטור וירטואלי.
יתרון של דפוס עיצוב במפעל
- תבנית שיטת המפעל מאפשרת לתת-מחלקות לבחור את סוג האובייקטים ליצירה.
- זה מקדם את צימוד רופף על ידי ביטול הצורך לאגד מחלקות ספציפיות ליישום לתוך הקוד. זה אומר שהקוד מקיים אינטראקציה אך ורק עם הממשק או המחלקה המופשטת שנוצרו, כך שהוא יעבוד עם כל מחלקות שמיישמות את הממשק הזה או שמרחיבות את המחלקה המופשטת.
שימוש בדפוס עיצוב מפעל
- כאשר מחלקה לא יודעת אילו מחלקות משנה יידרשו ליצור
- כאשר מחלקה רוצה שתתי המחלקות שלה מציינות את האובייקטים שייווצרו.
- כאשר מחלקות האב בוחרות ביצירת אובייקטים לתת-מחלקות שלה.
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.
הורד את חשבון החשמל הזה דוגמה