ראשי > factory method pattern > חלק שני
The Factory Method

המבנה הכללי:
להלן המבנה הכללי של ה factory method. אם אינכם זוכרים כיצד לקרוא את הדיאגרמה הבאה זה הזמן
להתרענן .

לחצו להגדלה
לחץ להגדלה - factory method

למעלה
מיהם החברים בחגיגה?:
  • Product (Document) - מגדיר ממשק עבור אובייקטים שה factory method יוצרת.
  • ConcreteProduct (MyDocument) - מממש את הממשק של Product.
  • Creator (Application) - מגדיר את ה factory method, אשר מחזירה אובייקט מסוג Product. ייתכן והמחלקה Creator תגדיר מימוש ברירת מחדל ל factory method שמחזירה אובייקט ברירת מחדל של ConcreteProduct כלשהו. יתכן והיא גם תהיה זו הקוראת ל factory method כדי ליצור אובייקט Product.
  • ConcreteCreator (MyApplication) - דורסת ומממשת מחדש את ה factory method על מנת להחזיר מופע של ConcreteProduct.
למעלה
מתי נשתמש בfactory method pattern?: למעלה
יחסי העבודה:
  • Creator מסתמך על subclass ים שלו שיגדירו את ה factory method כך שהיא תחזיר מופע של ConcreteProduct מהסוג המתאים.
למעלה
יתרונות וחסרונות:
Factory methods מבטלות את הצורך לקשור מחלקות שהן תלויות אפליקציה לקוד שלנו. הקוד מתעסק רק עם הממשק של Product ולכן הוא יכול לעבוד עם כל ConcreteProduct שיוגדר על ידי המשתמש.
חסרון פוטנציאלי של ה factory method הוא שהקליינטים עלולים להצטרך לבצע subclassing ל Creator רק בשביל ליצור אובייקט ConcreteProduct מסוים. אם הקליינט היה צריך לבצע subclassing ל creator בכל מקרה אז זה בסדר, אבל אחרת הקליינט צריך להתמודד עם עוד נקודת הסתכלות. שתי נקודות נוספות:
  • מספקת נקודת אחיזה ל subclass ים - יצירת אובייקטים בתוך class בעזרת factory method זו תמיד שיטה יותר גמישה מאשר יצירה שלהם באופן ישיר. factory method נותנת ל subclass ים נקודת אחיזה בשביל לספק גרסאות מורחבות של אובייקטים.
    בדוגמה של ה Document מקודם, המחלקה Document יכלה להגדיר factory method שתקרא CreateFileDialog() אשר יוצרת אובייקט ברירת מחדל של תיבת דו-שיח עבור פתיחה של מסמך קיים. ואז subclass של Document יוכל להגדיר תיבת דו-שיח שהיא ספציפית לאפליקציה על ידי דריסה של ה factory method הזו. במקרה זה ה factory method אינה אבסטרקטית, אלא מספקת מימוש ברירת מחדל הגיוני.
  • מקשרת היררכיות מחלקות מקבילות - בדוגמה שראינו עד כה, ה factory methods נקראות רק על ידי ה Creator ים. אך זה לא חייב להיות המקרה; קליינטים יכולים למצוא בהן שימוש, בעיקר במקרה של היררכיות מחלקות מקבילות.
    היררכיות מחלקות מקבילות יכולות להופיע כאשר class מבצע delegation של חלק מתחומי האחריות שלו ל class נפרד. נשמע מפחיד?? ניתן דוגמה:
    חישבו על צורות גרפיות שניתן לשנותן באופן אינטראקטיבי,למשל למתוח, לסובב ולהזיז אותן בעזרת העכבר. מימוש של אינטראקציות כאלו הוא לא תמיד קל. הוא לעתים דורש אחסון ועדכון של אינפורמציה ששומרת נתונים על מצב השינוי בזמן נתון ומעדכנת את עצמה תוך כדי הביצוע של השינוי. אינפורמציה זו דרושה לנו רק במהלך ביצוע השינוי ולא לאחר מכן. מכיוון שכך אין צורך לשמור אותה כחלק מאובייקט הצורה הגרפית (נקרא לו כאן Figure). יותר מכך, צורות גרפיות שונות מתנהגות שונה בזמן שמבצעים בהן שינוי. למשל, מתיחה של אובייקט קו יכולה לקבל את המשמעות של שינוי נקודת הקצה שלו, בעוד שמתיחה של טקסט יכולה להתבצע כהגדלת הרווחים בין השורות.
    עם הגבלות אלו, עדיף להשתמש באובייקט Manipulator נפרד אשר מממש את האינטראקציה ומבצע את השינוי, תוך כדי מעקב על המצב הרגעי של השינוי המתבצע. Figure ים שונים יצטרכו subclass ים שונים של Manipulator כדי לטפל באינטראקציה מסוימת. היררכית ה Manipulator ים המתקבלת היא מקבילה (לפחות באופן חלקי) להיררכיית ה Figure ים. אם אינכם זוכרים כיצד לקרוא את הדיאגרמה הבאה זה הזמן להתרענן .

    לחצו להגדלה
    לחץ להגדלה - factory method בהיררכיות מקבילות

    המחלקה Figure מספקת factory method שנקראת CreateManipulator() ומאפשרת לקליינטים ליצור את ה Manipulator המתאים לכל Figure. ה subclass ים של Figure דורסים אותה ומממשים אותה מחדש כך שתחזיר את ה subclass של Manipulator המתאים להם. באופן אלטרנטיבי, ה Figure יכול לתת מימוש ברירת מחדל כלשהו ל CreateManipulator() וה subclass ים של Figure פשוט יירשו אותו. יתכן וחלק מהם לא יסתפקו במימוש זה ויממשו אותה מחדש. ה Figure ים שיירשו אותה כמו שהיא לא יצטרכו שיהיה להם Manipulator מיוחד ולכן ההיררכיות הן מקבילות באופן חלקי.
    שימו לב כיצד ה factory method מגדירה את הקשר בין שתי היררכיות class ים. היא הופכת את המידע של איזה class ים שייכים אחד לשני למקומי.
למעלה







 
מה בעמוד:
 
המבנה
המשתתפים
מתי נשתמש
יחסי העבודה
בעד ונגד