הקדמה
תבניות עיצוב נפוצות מאוד בקרב מפתחי תוכנה. תבנית עיצוב היא פתרון מפורט לבעיה תוכנה נפוצה.
כמה מהיתרונות של שימוש בתבניות עיצוב הם:
- תבניות עיצוב מוגדרות כבר ומספקות גישה תעשייתית סטנדרטית לפתרון בעיה חוזרת, כך שחוסכים זמן אם אנו משתמשים בתבנית עיצוב בצורה משוכללת. קיימות תבניות עיצוב רבות בשפת ג'אווה שניתן להשתמש בהן בפרויקטים המבוססים על ג'אווה.
- שימוש בתבניות עיצוב מקדם השימושיות מחדש שמביאה לקוד חזק וניתן לתחזוקה יותר. זה עוזר להפחתת עלות הבעלות הכוללת (TCO) של מוצר התוכנה.
- מאחר ותבניות העיצוב כבר מוגדרות, הקוד שלנו מקל להבנה ולאיתור באגים. זה מוביל לפיתוח מהיר יותר וגם לחברי הצוות החדשים להבין את זה בקלות.
תבניות עיצוב בשפת ג'אווה מחולקות לשלוש קטגוריות – יצירה, מבני, ו התנהגותי.
מאמר זה משמש כאינדקס לכל המאמרים על תבניות העיצוב בשפת ג'אווה.
תבניות עיצוב יצירה
תבניות העיצוב היצירתיות מספקות פתרונות ליצירת אובייקט בדרכים הטובות ביותר למצבים ספציפיים.
1. תבנית הסינגלטון
תבנית הסינגלטון מגבילה את היצירה של מחלקה ומבטיחה שרק אינסטנס אחד של המחלקה קיים בתוך המכונת ג'אווה הווירטואלית. היישום של תבנית הסינגלטון תמיד היה נושא מעורר סכסוך בין מפתחים.
הערה: למד עוד על תבנית העיצוב סינגלטון.
2. תבנית המפענח
תבנית העיצוב המפענח משמשת כאשר יש לנו מערך עם מחלקה אב ומחלקות משנה מרובות ועל פי הקלט, אנו צריכים להחזיר אחת מהמחלקות המשנה. תבנית זו מוציאה את האחריות ליצירת מחלקה מהתוכנית למחלקת המפענח. אנו יכולים ליישם תבנית סינגלטון על מחלקת המפענח או להפוך את השיטה של המפענח לסטטית.
הערה: למד עוד על תבנית העיצוב מפענח.
תבנית המפעל המופשט
תבנית המפעל המופשט היא דומה לתבנית המפעל והיא מפעל של מפעלים. אם אתה מכיר את תבנית העיצוב המפעלי ב-Java, תגלה שיש לנו מחלקת מפעל יחידה שמחזירה את המחלקות השונות בהתבסס על הקלט המסופק והמחלקה של המפעל משתמשת בהצהרות if-else
או switch
כדי להשיג זאת. בתבנית המפעל המופשט, אנו מתגברים על בלוק if-else
ויש לנו מחלקת מפעל עבור כל מחלקה מופשטת ואז מחלקת מפעל מופשטת שתחזיר את המחלקה מופשטת בהתבסס על מחלקת המפעל הקלט.
הערה: למידע נוסף על תבנית המפעל המופשט.
תבנית הבונה
תבנית הבונה הוצגה כדי לפתור חלק מהבעיות עם תבנית המפעל ותבנית המפעל המופשט כאשר האובייקט מכיל הרבה מאפיינים. תבנית זו פותרת את הבעיה עם מספר רב של פרמטרים אופציונליים ומצב שונה על ידי ספק דרך לבנות את האובייקט שלב אחרי שלב ולספק שיטה שפועלת באמת תחזיר את האובייקט הסופי Object
.
הערה: למד עוד על תבנית הבונה.
5. תבנית המקור
תבנית המקור משמשת כאשר יצירת ה־Object
היא יקרה ודורשת הרבה זמן ומשאבים, ויש לך Object
דומה כבר קיים. לכן, תבנית זו מספקת מנגנון להעתיק את ה־Object
המקורי ל־Object
חדש ולאחר מכן לשנות אותו לפי הצורך שלנו. תבנית זו משתמשת בהעתקה ב־Java כדי להעתיק את ה־Object
. תבנית תכנון המקור מחייבת את ה־Object
שאתה מעתיק יספק את תכונת ההעתקה. זה לא ייעשה על ידי כל מחלקה אחרת. אולם, האם להשתמש בהעתקת שטח או עמוקה של תכונות האובייקט תלוי בדרישות והיא החלטת עיצוב.
הערה: למד עוד על תבנית המקור.
תבניות עיצוב מבניות
עיצובים מבניים מספקים דרכים שונות ליצירת מבנה של קוד (לדוגמה, באמצעות ירושה והרכבה ליצירת אובייקט גדול מאובייקטים קטנים).
1. תבנית מתאים
תבנית המתאים היא אחת מתבניות העיצוב המבניות ונמצאת בשימוש כדי ששני ממשקים לא קשורים יכולים לעבוד יחד. האובייקט שמקשר בין ממשקים אלו נקרא מתאים.
הערה: למד עוד על תבנית המתאים.
2. תבנית מרכיב
תבנית המרכיב נמצאת בשימוש כאשר יש לנו לייצג היררכיה של חלק-כולו. כאשר עלינו ליצור מבנה בדרך שבה אובייקטים במבנה יודרשו להתייחס באותה דרך, אנו יכולים להחיל את תבנית המרכיב.
הערה: למד עוד על תבנית המרכיב.
3. תבנית ה-Proxy
תבנית ה-Proxy מספקת מקום מזויף עבור אובייקט אחר כדי לשלוט בגישה אליו. תבנית זו משמשת כאשר רוצים לספק גישה שלטונית לפונקציונליות.
הערה: למידע נוסף על תבנית ה-Proxy.
4. תבנית ה-Flyweight
תבנית העיצוב ה-Flyweight משמשת כאשר יש צורך ליצור הרבה אובייקט
ים ממחלקה מסוימת. מאחר וכל אובייקט
משתמש במקום זיכרון שעשוי להיות קריטי עבור מכשירים עם זיכרון נמוך (כמו מכשירים ניידים או מערכות משובצות), תבנית העיצוב ה-Flyweight יכולה להיחשב כדי להפחית את העומס על הזיכרון על ידי שיתוף אובייקט
ים.
יישום ברכישת מחרוזות ב-Java הוא אחד מדוגמאות הטובות ביותר ליישום של תבנית ה-Flyweight.
הערה: למידע נוסף על תבנית ה-Flyweight.
5. תבנית הממשק
התבנית ממשק משמשת לסיוע ליישומים לקוח להתקשר בקלות עם המערכת.
הערה: למד עוד על תבנית הממשק.
6. תבנית הגשר
כאשר יש לנו הדגמות ממשק בכמויות רבות בשני הממשקים ובמימוש, אז נעשה שימוש בתבנית העיצוב הגשרי כדי לנתק את הממשקים מהמימוש ולהסתיר את פרטי המימוש מתוכניות הלקוח. יישום תבנית העיצוב הגשרי עוקב אחר העקרון של העדפת קומפוזיציה מעל ירושה.
הערה: למד עוד על תבנית הגשר.
7. תבנית העיטוף
התבנית של עיצוב הדקורטור משמשת לשנות את הפונקציות של אובייקט בזמן ריצה. באותו זמן, ייצרו אחרים מאותו הסוג לא ייתפסו על ידי השינוי וישאירו עם ההתנהגות המותאמת. עיצוב הדקורטור הוא אחד מתבניות העיצוב המבניות (כמו תבנית מתאם, תבנית גשר, או תבנית מרוכבת) ומשתמש במחלקות אבסטרקטיות או ממשקים עם הרכבה כדי לממש. אנו משתמשים בהמשכיות או בהרכבה כדי להרחיב פעולת אובייקט, אך זה נעשה בזמן קומפילציה, וזה יתייחס לכל המופעים של המחלקה. אין לנו אפשרות להוסיף פונקציות חדשות או להסיר כל התנהגות קיימת בזמן ריצה – זהו המקום בו תבנית הדקורטור משמשת.
הערה: למד עוד על תבנית הדקורטור.
תבניות לעיצוב ההתנהגותי
תבניות ההתנהגותיות מספקות פתרונות לאינטראקציה טובה יותר בין אובייקטים ואיך לספק קישור חלש וגמישות להרחבה בקלות.
1. תבנית שיטת התבנית
התבנית של אופן הפעולה היא תבנית עיצוב התוכנה המשמשת ליצירת תבנית עבור שיטת פעולה ולהעביר חלק מהשלבים של היישום לתת-מחלקות. השיטה של התבנית מגדירה את השלבים לביצוע אלגוריתם, והיא יכולה לספק יישום ברירת מחדל שעשוי להיות משותף לכל או חלק מתת-המחלקות.
הערה: למידע נוסף על תבנית אופן הפעולה.
2. תבנית התיאום
תבנית עיצוב של התיאום משמשת לספק מדיה לתקשורת מרכזית בין אובייקטים שונים במערכת. אם האובייקטים מתקשרים ישירות זה עם זה, מרכיבי המערכת מקושרים באופן קשה זה עם זה, מה שגורר עלויות תחזוקה גבוהות יותר ולא מאפשר גמישות בהרחבה. תבנית התיאום מתמקדת בספק מתווה בין אובייקטים לתקשורת וביישום קישור רפוי בינהם. התיאום פועל כמפנה בין אובייקטים, ויכול לכלול בדיקה עצמאית לספק דרך של תקשורת.
הערה: למידע נוסף על תבנית התיאום.
3. עקרון של שרשרת של אחריות
עקרון של שרשרת של אחריות משמש להשגת זרימה נפרדת בעיצוב תוכנה, שבה בקשה מהלקוח מועברת לשרשרת של אובייקטים לעיבוד. לאחר מכן, האובייקט בשרשרת יחליט מי יעבוד על הבקשה והאם יש צורך לשלוח את הבקשה לאובייקט הבא בשרשרת או לא.
אנו יודעים שאפשר להשתמש במספר רב של בלוקי catch
בתוך בלוק של try-catch
. בכל בלוק catch
מהו עיבוד לסוג מסוים של חריגה. לכן, כאשר חריגה מתרחשת בתוך בלוק try
, היא נשלחת לבלוק הראשון של catch
לטיפול. אם הבלוק של catch
אינו מסוגל לטפל בה, הוא מעביר את הבקשה לאובייקט הבא בשרשרת (כלומר, ה-catch
הבא). אם גם ה-catch
האחרון אינו מסוגל לטפל בה, החריגה מועברת מחוץ לשרשרת לתוכנית הקוראת.
הערה: למידע נוסף על עקרון של שרשרת של אחריות, ראה כאן.
4. עקרון של תבטא
תבנית המתצפת היא שימושית כאשר אתה מעוניין במצב של אובייקט
ורוצה לקבל הודעה כאשר יש שינוי. בתבנית המתצפת, האובייקט
שצופה במצב של אובייקט
אחר נקרא מתצפת, והאובייקט
שמצפים לו נקרא נושא.
Java מספקת פלטפורמה מובנית למימוש תבנית המתצפת דרך המחלקה java.util.Observable
והממשק java.util.Observer
. עם זאת, היא לא משמשת באופן נרחב משום שהמימוש מוגבל ורוב הזמן אנחנו לא רוצים לסיים בהרחבת מחלקה רק בשביל לממש את תבנית המתצפת, שכן Java לא מספקת ירושה מרובה במחלקות. שירות הודעות Java (JMS) משתמש בתבנית המתצפת יחד עם תבנית המתווך כדי לאפשר ליישומים להירשם ולפרסם נתונים ליישומים אחרים.
הערה: למד עוד על תבנית המתצפת.
5. תבנית אסטרטגיה
תבנית אסטרטגיה משמשת כאשר יש לנו מספר אלגוריתמים למשימה מסוימת, והלקוח מחליט איזו יישום ישמש במהלך זמן הריצה. תבנית אסטרטגיה נקראת גם תבנית מדיניות. אנחנו מגדירים מספר אלגוריתמים ומאפשרים ליישומים של לקוחות להעביר את האלגוריתם שישמש כפרמטר.
אחד הדוגמאות הטובות ביותר לתבנית זו היא השיטה Collections.sort()
שמקבלת את הפרמטר Comparator. בהתבסס על יישומים שונים של ממשקי השוואה, העצמים מסודרים בדרכים שונות.
הערה: למדו עוד על תבנית האסטרטגיה.
6. תבנית פקודה
תבנית הפקודה משמשת ליישום המפריד בין קריאה לתגובה. בתבנית זו, הבקשה נשלחת למפעיל והמפעיל מעביר אותה לעצם הפקודה המקופץ. העצם הפקודה מעביר את הבקשה לשיטה המתאימה של המקבל כדי לבצע את הפעולה המסוימת.
הערה: למדו עוד על תבנית הפקודה.
7. תבנית מצב
תבנית העיצוב המדינה משמשת כאשר Object
משנה את ההתנהגות שלו בהתבסס על מצבו הפנימי. אם עלינו לשנות את ההתנהגות של Object
בהתבסס על המצב שלו, נוכל להשתמש במשתנה מצב ב-Object
ולהשתמש בבלוק תנאי if-else
כדי לבצע פעולות שונות בהתבסס על המצב. תבנית המצב משמשת לספק דרך מערכתית וללא חיבור צמוד לזהות כדי להשיג זאת דרך הממשק והמימושים של המצב.
הערה: למידע נוסף על תבנית המצב.
8. תבנית מבקר
תבנית המבקר משמשת כאשר עלינו לבצע פעולה על קבוצה של סוגי אובייקטים דומים. בעזרת תבנית המבקר, אנו יכולים להעביר את הלוגיקה הפעולתית מהאובייקטים למחלקה אחרת.
הערה: למידע נוסף על תבנית המבקר.
9. תבנית המפרש
תבנית המפרש משמשת להגדיר תיאור דקדוקי של שפה ומספקת מפרש להתמודד עם דקדוק זה.
10. דפוס האיטרטור
דפוס האיטרטור הוא אחד מהדפוסים ההתנהגותיים ומשמש לספק דרך סטנדרטית לעבור דרך קבוצת עצמים. דפוס האיטרטור נמצא בשימוש נרחב במסגרת מערכת האוסף של ג'אווה, היכן שממשק האיטרטור מספק שיטות לעבור דרך Collection
. דפוס זה משמש גם לספק סוגים שונים של איטרטורים בהתבסס על הדרישות שלנו. דפוס האיטרטור מסתיר את היישום האמיתי של עברת הCollection
ותוכניות לקוח משתמשות בשיטות איטרטור.
הערה: למידע נוסף על דפוס האיטרטור.
11. דפוס המנטו
דפוס העיצוב של מנטו משמש כאשר רוצים לשמור על מצב של אובייקט כך שנוכל לשחזר אותו מאוחר יותר. דפוס זה משמש לממש זאת בצורה שבה הנתונים של מצב השמור של האובייקט אינם נגישים מחוץ לObject
, וזה מגן על תקינות הנתונים של מצב השמור.
התבנית Memento מיושם עם שניי אובייקטים – originator ו־caretaker. הָאוֹרִיגִינָטוֹר הוא הָאוֹבִיקְט שצריך לשמור ולשחזר את המצב שלו, והוא משתמש במחלקה פנימית כדי לשמור על מצב הָאוֹבִיקְט. המחלקה הפנימית נקראת "Memento", והיא private
כך שלא ניתן לגשת אליה מאובייקטים אחרים.
תבניות עיצוב שונות
ישנם הרבה תבניות עיצוב שאינן נכללות תחת תבניות העיצוב של קבוצת הארבע. בואו נסתכל על כמה מתבניות העיצוב הפופולריות הללו.
1. תבנית עיצוב DAO
תבנית העיצוב "אובייקט גישה לנתונים" (DAO) משמשת לנפרד את הלוגיקה של הקיום הנתונים לשכבה נפרדת. DAO היא תבנית פופולרית מאוד כאשר אנו מעצבים מערכות לעבוד עם מסדי נתונים. הרעיון הוא לשמור על שכבת השירותים מופרדת משכבת הגישה לנתונים. בכך אנו מיישמים את נפרדות הלוגיקה ביישום שלנו.
הערה: למדו עוד על תבנית העיצוב DAO.
2. תבנית הזרמת תלות
תבנית הזרמת התלות מאפשרת לנו להסיר את התלותים הקשים-קוד ולהפוך את היישום שלנו ללא-קשר, לנרתב, ולניתן לתחזוקה. אנו יכולים ליישם הזרמת תלות ב-Java כדי להעביר את פתרון התלות מזמן הקומפילציה לזמן הריצה. המסגרת של Spring בנויה על עקרון הזרמת תלות.
הערה: למד עוד על תבנית הזרמת תלות.
3. תבנית MVC
תבנית המודל-תצוגה-בקר (MVC) היא אחת מהתבניות הארכיטקטוניות הוותיקות ביותר ליצירת יישומי אינטרנט.
מסקנה
מאמר זה סיכם את תבניות עיצוב Java.
אתה יכול לבדוק דוגמאות לקוד תבניות עיצוב Java מ-מאגר הקוד שלנו ב-GitHub.
המשך את למידתך עם עוד מדריכי Java.
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial