Singleton

Dasturiy injiniringda singleton model(singleton pattern)i – bu dasturni loyihalash modeli tushunchasi bo'lib, u bitta klassdan faqat bitta obyekt yaratish imkonini beradi.

Bunday qilish butun loyiha bo'ylab faqat bitta obyektning metodlarini ishlatish paytida qo'l keladi. Ushbu termin matematik singleton tushunchasidan kelib chiqqan.

*** Matematik singleton tushunchasi. Matematikada singleton – bu faqat bitta elementdan iborat to'plam. Masalan, {null} to'plami singleton hisoblanadi. Manba: https://en.wikipedia.org/wiki/Singleton_(mathematics) ***

Tanqidchilarning fikricha singleton anti-model bo'lib hisoblanadi, chunki u ko'pincha foydasiz deb hisoblanadigan senariylarda ishlatiladi va biror klassdan olingan yagona obyekt talab qilinmaydigan holatlarda keraksiz cheklanishlarga sabab bo'ladi.

Singleton loyihalash modeli 23 ta mashhur loyihalash modellari( https://en.wikipedia.org/wiki/Design_Patterns)dan biri bo'lib u obyektga yo'naltirilgan dasturlarlarni moslashuvchan va qayta ishlatish imkonini beradigan qilib loyihalashda paydo bo'luvchi takrorlanuvchi loyihalash muammolarini hal qilishni tavsiflab beradi.

Singleton loyihalash modeli quyidagi muammolarni hal qiladi:

  • Qanday qilib bitta klassdan faqat bitta obyekt yaratishni kafolatlash?
  • Qanday qilib shu yaratilgan yagona obyektni oson qo'llay olish?
  • Qanday qilib shu klass o'zidan nusxa olishni boshqaradi?
  • Qanday qilib klassdan olinadigan nusxalar soni cheklanadi?

Singleton loyihalash modeli quyidagi muammolarni tushuntiradi:

  • Klassning kostruktorini yashirish;
  • Ochiq va doimiy(public static) klassning yagona nusxalarini qaytaruvchi metod(getInstance() )ni e'lon qilish

Ushbu loyihalash modelining asosiy g'oyasi, klassni o'z nusxalarini boshqarishga javobgar qilish hisoblanadi. Yashirin konstruktor (private bilan e'lon qilinadi) klassdan tashqaridan turib nusxa olish imkonini bermaslikni ta'minlaydi. Ochiq va doimiy(public static) metodini klass nomi va metod nomini yozish orqali osongina ishlatish mumkin bo'ladi.

Foydalanish holatlari

  • Abstrakt factory, builder va prototype modellari ushbu modellarning o'zini ishlatish paytida singletondan foydalanadi;
  • Facade obyektlar ko'pincha singleton bo'lib hisoblanadi. Chunki faqat bitta facade obyekti talab qilinadi;
  • State obyektlari ham ko'pincha singleton hisoblanadi;
  • Singletonlar ko'pincha global o'zgaruvchilardan Afzal ko'riladi. Chunki:
    • Singleton global nomlar fazosi(global namespace)ni keraksiz narsalar bilan to'ldirib tashlamaydi;
    • Singleton "xotiradan sekin joy ajaratish"(lazy allocation) va "sekin initsializatsiyalash"(lazy initialization)lardan foydalanishga ruxsat beradi. Global o'zgaruvchilar esa ko'pgina tillarda doim ortiqcha resurs talab qiladi.

Qo'llanilishi:

Singleton modelining qo'llanilishi:

  • Singleton klassning faqat bitta nusxasi bo'lishi kerakligini va
  • Shu yagona nusxadan global holda foydalanishni kafolatlashi kerak.

Odat bular quyidagicha amalga oshiriladi:

  • Klassning barcha konstruktorlarini private bilan e'lon qilish va
  • Nusxa orqali murojat qilinadigan klass metodlari doimiy(static) metod qilib e'lon qilinadi.

Nusxa odatda private static o'zgaruvchi sifatida saqlanadi; Nusxa static metod birinchi marta chaqirishdan oldin qaysidir nuqtada o'zgaruvchi initsializatsiya qilinganda yaratiladi.

Quyidagi misol Javada yozilgan:

public final class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

C# da:

public sealed class Singleton {
    private static readonly Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton Instance {
        get {
                return INSTANCE;
            }
    }
}

C# da static klasslar orqali ham singleton yaratish mumkin. Bu shu yaratilgan klassning o'zi singleton bo'lib hisoblanadi:

public static class Singleton {
    private static readonly MyOtherClass INSTANCE = new MyOtherClass();
    public static MyOtherClass Instance {
        get {
                return INSTANCE;
            }
    }
}

"Sekin initsializatsiyalsh"(Lazy initialization).

Singleton "sekin initsializatsiyalash"da ham foydalaniladi. "Sekin initsializatsiyalash"da nusxa static metod birincha marta ishga tushirilganda yaratiladi. Agar static metod bir vaqtning o'zida turli xildagi oqimlarda qo'llanilsa, klassdan bir nechta nusxa yaratilmasligi choralarini ko'rish kerak bo'ladi. Quyidagi kodda singletonning thread-safe(barcha oqimda umumiy ma'lumot tuzilmasi ishlatiladi) qo'llanishi keltirilgan. Bunda 'sekin initsializatsiyalash'dan foydalanilgan:

public final class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
    return instance;
    }
}
Manba:


AlisherN

Muallif haqida

AlisherN


Blogdagi so‘nggi maqolalar:


Fikrlar 4

Ertugul
Ertugul
Agar shu metoddan foydalanilsa, dastur davomida shu klassdan faqat 1 marta obyekt olinadimi? Va bu obyekt hamma joyda bir xilligicha qoladimi?
AlisherN
AlisherN
Singletonda yaratgan klassizni constructori private qilib e'lon qilinadi. cloning ham yopib qo'yiladi(private qilib). Ekzemplyar olish metodi static qilib e'lon qilinadi. Shunda bu klassdan faqat bitta obyekt ekzemplyarini olishiz mumkin bo'ladi.
AlisherN
AlisherN
Masalan: ``` class Singleton { // Hold an instance of the class private static $singleton; // private constructor bilan `new` operatori orqali yangi ekzemplyar yaratish cheklanadi private function __construct() { } //Private clone metodi bilan olingan obyektdan klon olishga ruxsat berilmaydi private function __clone() { } // Singleton ekzemplyarini beradi. public static function getInstance() { if (!isset(self::$singleton)) { self::$singleton = new Singleton(); } // static ekzemplyar return self::$singleton; } // Singleton ekzemplyarni unserialize qilishga yo'l qo'ymaydi private function __wakeup() { } }
Ertugul
Ertugul
AlisherN, javob uchun katta rahmat.
Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!