JavaRush /בלוג Java /Random-HE /דפוס סינגלטון במילים שלך
Roman_kh
רָמָה
Харьков

דפוס סינגלטון במילים שלך

פורסם בקבוצה

שלום לכולם, javaRush!

היום אספר לכם על דפוס העיצוב Singleton(יחיד). דפוס יחיד במילים שלך - 1מטרה: ליצור מחלקה שתהיה לה רק אובייקט אחד. זה אומר שלא משנה כמה פעמים ניגשים אליו, אותו אובייקט שנוצר בפעם הראשונה יוחזר. זה דבר נוח והכרחי בהרבה מקומות, לא בכדי זה מיושם במסגרות. יישום:
  • לדוגמה, צריך לחבר מסד נתונים לפרויקט ולכיתה שתהיה אחראית להתחבר אליו. החיבור נוצר פעם אחת ואין צורך ליצור אותו שוב ושוב
  • Application settings- מחלקה אחראית על הגדרות החיבור הדרושות לאפליקציה: מארח מסד נתונים ויציאה וכו'. הם נוצרים פעם אחת ומשמשים לאורך כל פעולת האפליקציה.
  • יש עוד דוגמאות רבות שלא הזכרתי, אז כתוב את האפשרויות שלך בתגובות! =)
לאחר ההקדמה הזו, למיטב הבנתי, תוכלו להראות דוגמה למחלקה הזו: (למרות שאני בטוח שכל אחד מאיתנו יכול להמציא יישום של זה) הנה הדוגמה הפשוטה ביותר, כאשר אנו הופכים את הקונסטרוקטור לפרטי, כלומר. אתה לא יכול ליצור אובייקט במפורש. ויש שיטה סטטית getInstance()שמספקת אובייקט.
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
יש בעיות עם ריבוי השחלות ואז אתה יכול לשים שיטת getInstance()סמן synchronized:
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
לסיום, כרגיל, אני רוצה לומר שאם אתם חושבים אחרת או מוצאים בי טעות, כתבו בתגובות! נדון בהנאה על הכל :) אם אהבת את המאמר, כתוב "+" ואני אדע את זה. זה חשוב לי :) נ.ב. אני מוסיף עוד הטמעות: לפי יהושע בלוך , זו הדרך הטובה ביותר ליישם את התבניתEnum Singleton
public enum Singleton {
   INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
        private static volatile Singleton instance;

        public static Singleton getInstance() {
      Singleton localInstance = instance;
      if (localInstance == null) {
         synchronized (Singleton.class) {
            localInstance = instance;
            if (localInstance == null) {
               instance = localInstance = new Singleton();
            }
         }
      }
      return localInstance;
   }
}
ובהמשך On Demand Holder idiom:
public class Singleton {

   public static class SingletonHolder {
      public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
      return SingletonHolder.HOLDER_INSTANCE;
   }
}
+אתחול עצל +ביצועים גבוהים -לא ניתן להשתמש בשדות מחלקה לא סטטיים כל שאלה/הצעה - כתבו בתגובות! ראה גם מאמרים אחרים שלי:
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION