מה זה סינגלטון?

לאחרונה נתקלתי במושג “סינגלטון” ולא הצלחתי להבין למה צריך אותו ואיך משתמשים בו.
אשמח גם לדוגמה בשפת התכנות Java.
תודה רבה :slight_smile:

סינגלטון (Singleton) נקרא גם יחידן, היא תבנית עיצוב, אשר נועדה למקרים בהם מעוניינים להגביל את יצירת המופעים של מחלקה מסוימת למופע יחיד. תבנית זו מקושרת לעיתים גם למקרים בהם רוצים להגביל את מספר המופעים לכמות קבועה כלשהי, ולאו דווקא למופע יחיד. נדרשת האפשרות לגשת לאיבר במחלקה singleton מבלי ליצור אובייקט של המחלקה, וכן מנגנון אשר ישמור את ערכי האיברים של המופע שנוצר. התבנית מושגת באמצעות מחלקה הכוללת פונקציה, אשר בקריאה הראשונה יוצרת מופע חדש, ובקריאות הבאות, מחזירה מצביע לאותו מופע שיצרה קודם. כדי להבטיח שאכן יהיה מופע בודד של המחלקה ולא ניתן יהיה ליצור אותה בצורה אחרת, הגדרת הגישה לפונקציית הבנאי מוגדרת כ-private או protected (רק אם אין מחלקות אחרות באותו ה-package). כמו כן, בדרך כלל מגדירים מתודה סטטית getInstance אשר מחזירה הפניה למופע. המופע בדרך כלל נשמר בשדה סטטי קבוע פרטי. להלן תוכנית בשפת Java אשר מדגימה זאת:

public static class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

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

public static class Singleton {
    private static Singleton instance;
    private Singleton() {
        if (instance != null) {
            throw new RuntimeException("You can't change constructor's visibility");
        }
    }
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

על מנת לאתחל אובייקט חדש סינגלטון, נשתמש:

Singleton s = Singleton.getInstance();

מקווה שמובן, בהצלחה :slight_smile:

3 לייקים