תבנית מפעל מופשטת בג'אווה

1. סקירה כללית

במאמר זה נדון בדפוס העיצוב של מפעל המופשט.

הספר דפוסי העיצוב: אלמנטים של תוכנה מונחית עצמים לשימוש חוזר קובע כי מפעל מופשט "מספק ממשק ליצירת משפחות של אובייקטים קשורים או תלויים מבלי לציין את הכיתות הקונקרטיות שלהם". במילים אחרות, מודל זה מאפשר לנו ליצור אובייקטים העוקבים אחר דפוס כללי.

דוגמה לדפוס העיצוב של מפעל מופשט ב- JDK הוא ה- newInstance () שֶׁל javax.xml.parsers.DocumentBuilderFactory מעמד.

2. דוגמה לתבנית עיצוב מפעל מופשטת

בדוגמה זו, ניצור שתי יישומים של דפוס עיצוב שיטת המפעל: AnimalFactory ו צֶבַעבית חרושת.

לאחר מכן, ננהל את הגישה אליהם באמצעות מפעל מופשט תקציר מפעל:

ראשית, ניצור משפחה של בעל חיים בכיתה וישתמש בהמשך במפעל המופשט שלנו.

הנה ה בעל חיים מִמְשָׁק:

ממשק ציבורי בעלי חיים {String getAnimal (); מחרוזת makeSound (); }

ויישום קונקרטי ברווז:

מחלקה ציבורית ברווז מיישם בעלי חיים {@Override מחרוזת ציבורית getAnimal () {להחזיר "ברווז"; } @Override מחרוזת ציבורית makeSound () {להחזיר "Squeks"; }} 

יתר על כן, אנו יכולים ליצור יישומים קונקרטיים יותר של בעל חיים ממשק (כמו כלב, דובי, וכו ') בדיוק באופן זה.

מפעל המופשט עוסק במשפחות של חפצים תלויים. עם זאת, אנו הולכים להציג משפחה נוספת צֶבַע כממשק עם כמה יישומים (לבן, חום, ...).

אנו מדלגים על הקוד בפועל לעת עתה, אך ניתן למצוא אותו כאן.

כעת, לאחר שהכנו מספר משפחות מוכנות, נוכל ליצור תקציר מפעל ממשק עבורם:

ממשק ציבורי AbstractFactory {T create (String animalType); }

לאחר מכן, נבצע יישום AnimalFactory באמצעות דפוס העיצוב של שיטת המפעל שדנו בו בסעיף הקודם:

מחלקה ציבורית מיישמת את AnimalFactory AbstractFactory {@Override Animal Animal create (String animalType) {if ("Dog" .equalsIgnoreCase (animalType)) {להחזיר כלב חדש (); } אחר אם ("ברווז" .equalsIgnoreCase (animalType)) {החזר ברווז חדש (); } להחזיר אפס; }} 

באופן דומה, אנו יכולים ליישם מפעל עבור צֶבַע ממשק המשתמש באותו דפוס עיצוב.

כשכל זה מוגדר, ניצור א ספקית מפעל בכיתה שתספק לנו יישום של AnimalFactory אוֹ ColorFactory תלוי בטיעון שאנו מספקים ל getFactory () שיטה:

class class FactoryProvider {public static AbstractFactory getFactory (בחירת מחרוזת) {if ("Animal" .equalsIgnoreCase (choice)) {להחזיר AnimalFactory חדש (); } אחר אם ("צבע" .equalsIgnoreCase (בחירה)) {להחזיר ColorFactory חדש (); } להחזיר אפס; }}

3. מתי להשתמש בתבנית מפעל מופשטת:

  • הלקוח אינו תלוי באופן בו אנו יוצרים ומחברים את האובייקטים במערכת
  • המערכת מורכבת ממספר משפחות של חפצים, ומשפחות אלה נועדו לשימוש יחד
  • אנו זקוקים לערך זמן ריצה כדי לבנות תלות מסוימת

הדפוס אמנם נהדר בעת יצירת אובייקטים שהוגדרו מראש, אך הוספת החדשים עשויה להיות מאתגרת. כדי לתמוך בסוג החדש של האובייקטים תידרש לשנות את תקציר מפעל מחלקה וכל מחלקות המשנה שלה.

4. סיכום

במאמר זה למדנו על דפוס העיצוב של מפעל מופשט.

לבסוף, כמו תמיד, ניתן למצוא את היישום של דוגמאות אלה ב- GitHub.