Java

הוליסטי

New member
Java

Hi, Suppose I have a class X and two inherited classes Y and Z. I want to have ONE methos, that "knows" which class to construct. I want this method NOT to use a switch-case or if-else statements. For example, in C, a similar probelem, I can set one of the input parameters to be a pointer to a function, and then, when calling with different functions, it will automatically call the input functions. The solution I have right now is using an if-else statement: public void method (String xStr, ...) { X x; if (xStr.equals("Y") x = new Y(...); else if (xStr.equals("Z") x = new Z(...); ... } What do you think ?
 

voguemaster

New member
אני חושב

שיש design pattern שנקרא Factory Method והוא עושה בדיוק את זה (אם זכור לי נכון). רמז: תחשבי על מתודה סטטית אבסטרקטית שיש במחלקת הבסיס וששני מחלקות הבן מממשות. אותה מתודה קלאסית משמשת לביצוע new למחלקה.
 

הוליסטי

New member
תודה, אבל...

אני אבדוק את Factory Method. אוקי, X יהיה אבסטרקטי ותהיה מתודה xx שכולם צריכים לממש. אני עדיין נשאר עם הבעיה איך לדעת מה לבצע: new Y או new Z, כי X אבסטרקטית ואי אפשר ליצור אותה ישירות. מה אתה אומר ?
 

הוליסטי

New member
ה design pattern מאוד עוזר

אבל לצערי יכול להיות שלא אוכל להימנע ממה ה if-else
 

voguemaster

New member
אוקיי התבלבלתי קלות

יש DESIGN PATTERN שמבוסס על ה-factory המפורסם והוא הרבה יותר מוצלח. קודם כל אני מוכרח לתת קרדיט, אלדד (DadleFish) הוא זה שלימד אותי אותו והוא גם הציג אותו פה בפורום פעם. מסתבר שבג'אווה זה מאוד קל לממש אותו. בעיקרון מה שקורה זה שיש אובייקט FACTORY מרכזי. אותו אובייקט מכיל Hashtable (בג'אווה) או Map ב ++C שממפה בין מחרוזת (שהיא שם המחלקה שרוצים לייצר) לבין אובייקט אחר שנקרא Creator. כל ה-Creators שלנו יורשים ממחלקת Creator בסיס ומבצעים פעולה אחת פשוטה ב-ctor שלהם: הם מבצעים register אל מול ה-Factory הראשי. כשזה קורה, ה-Factory מוסיף אותם ל-Hashtable שלו. הדבר הבא הוא להגדיר פונקציה אבסטרקטית ב-Creator שתפקידה ליצור אובייקט (אני השתמשתי ב-Object אבל אפשר כל אובייקט בסיס אחר). כל Creator שיורש מהמחלקה הזו יממש את פונק' היצירה ע"י החזרת אובייקט חדש מהטיפוס שלו. התוצאה - כשאתה קורא לפונקצית create ב-Factory שלך ומעביר את שם המחלקה שאתה רוצה ליצור, הוא בודק ב-Hashtable שלו ואם יש לו מיפוי ל-Creator המתאים הוא יקרא ל-create. כמובן שבגלל ירושה, תיקרא הפונק' המתאימה ויוחזר האובייקט הנכון. מימשתי את זה בכמה דקות (הפסקת קולה
) והנה זה (אלדד תודה!)
 
למעלה