דפוס אב טיפוס בג'אווה

1. הקדמה

במדריך זה נלמד על אחד מדפוסי העיצוב היצירתיים - דפוס האב טיפוס. בהתחלה נסביר על דפוס זה ונמשיך ליישם אותו ב- Java.

נדון גם בכמה מיתרונותיה וחסרונותיה.

2. דפוס אב טיפוס

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

בואו נשתמש באנלוגיה כדי להבין טוב יותר את הדפוס הזה.

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

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

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

3. דיאגרמת UML

בתרשים אנו רואים שהלקוח אומר לאב-טיפוס לשכפל את עצמו וליצור אובייקט. אב טיפוס הוא ממשק ומכריז על שיטה לשיבוט עצמו. בטון פרוטוטייפ 1 ו בטון פרוטוטיפ 2 ליישם את הפעולה לשיבוט עצמם.

4. יישום

אחת הדרכים בהן אנו יכולים ליישם תבנית זו בג'אווה היא באמצעות ה- שיבוט () שיטה. לשם כך היינו מיישמים את ניתנת לשיבוט מִמְשָׁק.

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

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

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

בואו ניקח את הדוגמא שהזכרנו קודם ונמשיך לראות כיצד ליישם את דפוס הפרוטוטיפ מבלי להשתמש ב- ניתנת לשיבוט מִמְשָׁק. על מנת לעשות זאת, בואו ליצור תַקצִיר כיתה נקראת עֵץ עם תַקצִיר שיטה 'עותק'.

מעמד מופשט ציבורי עץ {// ... העתק עץ מופשט ציבורי (); }

בואו נגיד שיש לנו שתי יישומים שונים של עֵץ שקוראים לו עץ פלסטיק ו עץ אורן:

מחלקה ציבורית PlasticTree מרחיב עץ {// ... @Override העתק עץ ציבורי () {PlasticTree plasticTreeClone = פלסטיק טרי חדש (this.getMass (), this.getHeight ()); plasticTreeClone.setPosition (this.getPosition ()); החזר plasticTreeClone; }}
מחלקה ציבורית PineTree מרחיב את העץ {// ... @ Override העתק עץ ציבורי () {PineTree pineTreeClone = PineTree חדש (this.getMass (), this.getHeight ()); pineTreeClone.setPosition (this.getPosition ()); להחזיר pineTreeClone; }}

אז הנה אנו רואים שהשיעורים מתארכים עֵץ וליישם את עותק השיטה יכולה לשמש כאבות טיפוס ליצירת עותק של עצמם.

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

5. בדיקות

עכשיו בואו לבדוק את זה:

מחלקה ציבורית TreePrototypesUnitTest {@Test public void givenAPlasticTreePrototypeWhenClonedThenCreateA_Clone () {// ... PlasticTree plasticTree = PlasticTree חדש (מסה, גובה); plasticTree.setPosition (עמדה); PlasticTree anotherPlasticTree = (PlasticTree) plasticTree.copy (); anotherPlasticTree.setPosition (otherPosition); assertEquals (position, plasticTree.getPosition ()); assertEquals (otherPosition, anotherPlasticTree.getPosition ()); }}

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

עכשיו בואו נשכפל רשימה של עצים:

@Test public void givenA_ListOfTreesWhenClonedThenCreateListOfClones () {// צור מקרים של עצים מפלסטיק ועץ רמה = Arrays.asList (plasticTree, pineTree); רשימת treeClones = trees.stream (). מפה (עץ :: העתק) .collect (toList ()); // ... assertEquals (גובה, plasticTreeClone.getHeight ()); assertEquals (position, plasticTreeClone.getPosition ()); }

שימו לב שאנחנו מסוגלים לעשות עותק עמוק של הרשימה כאן מבלי להיות תלוי ביישומים הקונקרטיים של עֵץ.

6. יתרונות וחסרונות

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

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

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

7. מסקנה

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

כרגיל, קוד המקור של מאמר זה זמין באתר Github.