מאמר זה פונה לכל מי שנתקל בפעם הראשונה במושג דפוסי עיצוב, שמע את המושג singleton או יישם איכשהו את דפוס הסינגלטון אבל לא הבין מה קורה. ברוך הבא! תלמידי CodeGym נתקלים בדפוסי עיצוב בפעם הראשונה ברמה 15, כאשר הקפטן מבקש מהם במפתיע "לחזק" את הבנתם על ידי יישום דפוס Java Singleton עם יישום עצלן. לסטודנטים ששומעים על דפוס הסינגלטון בפעם הראשונה יש הרבה שאלות: מה זה בכלל דפוס עיצובי? למה אנחנו צריכים את זה? מה זה סינגלטון ? ולבסוף, מהו יישום עצלן? בואו נענה על השאלות האלה לפי הסדר.
ודפוס הסינגלטון הוא רק אחד מהם.
עם בלאק ג'ק ומספרים ולהקדיש זמן רב לכך, או שאתה יכול ליישם אחד שהובן ותואר במשך זמן רב. אותו הדבר נכון עם דפוסי עיצוב. בנוסף, עם דפוסי עיצוב, הקוד הופך לסטנדרטי יותר, וכאשר משתמשים בדפוס המתאים, יש פחות סיכוי שתעשה טעויות, מכיוון שהמלכודות הנפוצות של הדפוס זוהו והוסרו לפני זמן רב. בנוסף לכל השאר, הכרת דפוסים עוזרת למתכנתים להבין זה את זה טוב יותר. אתה יכול פשוט לומר את שם התבנית במקום לנסות לספק הסבר ארוך לעמיתיך המתכנתים. לסיכום, דפוסי עיצוב עוזרים לך:
לסיום סעיף זה, נציין שניתן לחלק את כל גוף דפוסי העיצוב לשלוש קבוצות גדולות:
מה זה בכלל דפוס עיצובי?
אני מאמין שמעט היסטוריה נועדה לענות על שאלה זו בהבנה הטובה ביותר. ישנם ארבעה מחברי תכנות מפורסמים (אריך גמא, ג'ון וליסיידס, ראלף ג'ונסון וריצ'רד הלם) שהעלו רעיון מעניין. הם שמו לב שלעתים קרובות פיתוח תוכנה מחייב אותם לפתור את אותן בעיות בערך ולכתוב קוד מובנה באותו אופן. אז הם החליטו לתאר דפוסים טיפוסיים שלעיתים קרובות צריך להשתמש בהם בתכנות מונחה עצמים. ספרם פורסם בשנת 1994 תחת הכותרת Design Patterns: Elements of Reusable Object-Oriented Software. השם של הספר התברר כארוך מדי ואנשים התחילו לקרוא לו פשוט הספר של כנופיית הארבעה. המהדורה הראשונה כללה 23 דפוסים. לאחר מכן, התגלו עשרות דפוסים אחרים. אז הבה נסכם את התשובה לשאלה של הפסקה הזו (מהן בכלל דפוסי עיצוב?) בכמה מילים:תבנית עיצוב היא פתרון סטנדרטי לבעיה נפוצה. |
למה אנחנו צריכים דפוסי עיצוב?
אתה יכול לתכנת בלי לדעת דפוסים: אחרי הכל, עד רמה 15, כבר כתבת מאות מיני תוכניות ב-CodeGym בלי לדעת בכלל שהן קיימות. זה מצביע על כך שדפוסי עיצוב הם סוג של כלי שהשימוש בו מבדיל את המאסטר מהחובב: דפוסי עיצוב מתארים כיצד לפתור בעיה טיפוסית בצורה נכונה. המשמעות היא שהכרת דפוסים חוסכת לך זמן. בדרך זו, הם דומים לאלגוריתמים. לדוגמה, אתה יכול ליצור אלגוריתם מיון משלך
|

לבסוף, דפוס הסינגלטון
סינגלטון הוא דפוס יצירתי . דפוס זה מבטיח שיש רק מופע אחד של מחלקה ומספק נקודת גישה גלובלית לאובייקט זה. מהתיאור, צריך להיות ברור שיש ליישם דפוס זה בשני מקרים:- כאשר התוכנית שלך דורשת שלא ייווצר יותר מאובייקט אחד ממחלקה מסוימת. לדוגמה, למשחק מחשב עשוי להיות מחלקה Hero ורק אובייקט Hero אחד שמתאר את הגיבור היחיד במשחק.
- כאשר אתה צריך לספק נקודה לגישה גלובלית לאובייקט. במילים אחרות, עליך להפוך את האובייקט לזמין מכל מקום בתוכנית. למרבה הצער, זה לא מספיק פשוט ליצור משתנה גלובלי, מכיוון שהוא אינו מוגן כתיבה: כל אחד יכול לשנות את ערך המשתנה, כך שנקודת הגישה הגלובלית של האובייקט עלולה ללכת לאיבוד. מאפיינים אלה של Singleton נחוצים, למשל, כאשר יש לך אובייקט שעובד עם מסד נתונים, ואתה צריך לגשת למסד הנתונים מחלקים שונים של התוכנית. Singleton יבטיח שאף אחד לא יכתוב קוד שמחליף את המופע שנוצר קודם לכן .
-
מצא דוגמה לסינגלטון עם אתחול עצלן.
-
צור שלושה מחלקות יחיד - שמש, ירח, כדור הארץ - בקבצים נפרדים תוך שימוש באותו עיקרון.
-
ליישםכוכב לכתממשק בכיתות שמש , ירח וכדור הארץ .
- בבלוק סטטי של המחלקה Solution קרא אתreadKeyFromConsoleAndInitPlanetשיטה.
-
יישם אתreadKeyFromConsoleAndInitPlanetפונקציונליות השיטה:
-
5.1. קרא פרמטר מחרוזת אחד מהמסוף
-
5.2. אם הפרמטר שווה לאחד מה-כוכב לכתהקבועים של הממשק, צור את אובייקט ה-Planet מתאים .
-
-
אתה צריך לתת למחלקה שדה סטטי פרטי המאחסן אובייקט בודד:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; // #1 }
-
הפוך את הבנאי (ברירת המחדל) לפרטי. המשמעות היא שלא ניתן לגשת אליו מחוץ למחלקה ולא תוכל להחזיר אובייקטים חדשים:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton(){} // #2 }
-
הכריז על שיטת יצירה סטטית שתשמש לקבלת הסינגלטון:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} public static LazyInitializedSingleton getInstance() { // #3 if (instance == null) { // If the object has not yet been created instance = new LazyInitializedSingleton(); // Create a new object } return instance; // Return the previously created object } }
GO TO FULL VERSION