JavaRush /Java blogi /Random-UZ /Dizayn naqshlari: Singleton

Dizayn naqshlari: Singleton

Guruhda nashr etilgan
Salom! Bugun biz turli dizayn naqshlarini batafsil ko'rib chiqamiz va biz "singleton" deb ham ataladigan Singleton naqshidan boshlaymiz. Dizayn naqshlari: Singleton - 1Keling, eslaylik: biz umuman dizayn naqshlari haqida nimani bilamiz? Dizayn naqshlari bir qator ma'lum muammolarni hal qilish uchun amal qilishi mumkin bo'lgan eng yaxshi amaliyotlardir. Dizayn naqshlari odatda biron bir dasturlash tiliga bog'liq emas. Ularni tavsiyalar to'plami sifatida qabul qiling, shundan so'ng siz xatolardan qochishingiz va g'ildirakni qayta ixtiro qilmasligingiz mumkin.

Singleton nima?

Singleton - bu sinfga qo'llanilishi mumkin bo'lgan eng oddiy dizayn naqshlaridan biri. Odamlar ba'zan "bu sinf singleton" deyishadi, ya'ni bu sinf singleton dizayn naqshini amalga oshiradi. Ba'zan faqat bitta ob'ekt yaratilishi mumkin bo'lgan sinfni yozish kerak bo'ladi. Masalan, ma'lumotlar bazasiga kirish yoki ulanish uchun mas'ul bo'lgan sinf. Singleton dizayn namunasi bunday vazifani qanday bajarishimiz mumkinligini tasvirlaydi. Singleton - bu ikkita narsani bajaradigan dizayn namunasi:
  1. Sinfning faqat bitta nusxasiga ega bo'lishiga kafolat beradi.

  2. Ushbu sinf namunasiga global kirish nuqtasini taqdim etadi.

Demak, singleton naqshining deyarli har bir amalga oshirilishiga xos bo'lgan ikkita xususiyat mavjud:
  1. Xususiy konstruktor. Sinf ob'ektlarini sinfdan tashqarida yaratish qobiliyatini cheklaydi.

  2. Sinf namunasini qaytaradigan umumiy statik usul. Bu usul deyiladi getInstance. Bu sinf misoliga global kirish nuqtasi.

Amalga oshirish imkoniyatlari

Singleton dizayn namunasi turli usullarda qo'llaniladi. Har bir variant o'ziga xos tarzda yaxshi va yomon. Bu erda, har doimgidek: ideal yo'q, lekin siz bunga intishingiz kerak. Lekin, birinchi navbatda, nima yaxshi va nima yomon ekanligini va dizayn namunasini amalga oshirishni baholashga qanday ko'rsatkichlar ta'sir qilishini aniqlaylik. Keling, ijobiy tomondan boshlaylik. Amalga oshirishning jozibadorligi va jozibadorligini ta'minlaydigan mezonlar:
  • Dangasa ishga tushirish: dastur kerak bo'lganda ishlayotgan vaqtda sinf yuklanganda.

  • Kodning soddaligi va shaffofligi: ko'rsatkich, albatta, sub'ektiv, ammo muhim.

  • Ip xavfsizligi: ko'p tarmoqli muhitda to'g'ri ishlaydi.

  • Ko'p tarmoqli muhitda yuqori unumdorlik: resursni almashishda iplar bir-birini minimal darajada bloklaydi yoki umuman bloklamaydi.

Endi kamchiliklar. Amalga oshirishni yomon ko'rsatadigan mezonlarni sanab o'tamiz:
  • Dangasa bo'lmagan ishga tushirish: kerak yoki kerak emasligidan qat'i nazar, dastur ishga tushganda sinf yuklanganda (paradoks, IT olamida dangasa bo'lish yaxshiroqdir)

  • Kodning murakkabligi va yomon o'qilishi. Ko'rsatkich ham sub'ektivdir. Agar qon ko'zdan chiqsa, amalga oshirish shunday bo'ladi deb taxmin qilamiz.

  • Ip xavfsizligining etishmasligi. Boshqacha qilib aytganda, "ip xavfi". Ko'p tarmoqli muhitda noto'g'ri ishlash.

  • Ko'p tarmoqli muhitda yomon ishlash: mavzular har doim yoki ko'pincha manbani ulashganda bir-birini bloklaydi.

Kod

Endi biz ijobiy va salbiy tomonlarini sanab o'tish uchun turli xil variantlarni ko'rib chiqishga tayyormiz:

Oddiy yechim

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

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
Eng oddiy amalga oshirish. Taroziga soling:
  • Kodning soddaligi va shaffofligi

  • Ip xavfsizligi

  • Ko'p tarmoqli muhitda yuqori ishlash

Kamchiliklari:
  • Dangasa ishga tushirish emas.
Oxirgi kamchilikni tuzatishga urinib, biz ikkinchi raqamni qo'lga kiritamiz:

Lazy Initialization

public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Taroziga soling:
  • Dangasa ishga tushirish.

Kamchiliklari:
  • Ip xavfsiz emas

Amalga oshirish qiziqarli. Biz dangasalik bilan ishga tushirishimiz mumkin, lekin biz ip xavfsizligini yo'qotdik. Muammo yo'q: uchinchi dasturda biz hamma narsani sinxronlashtiramiz.

Sinxronlashtirilgan aksessuarlar

public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Taroziga soling:
  • Dangasa ishga tushirish.

  • Ip xavfsizligi

Kamchiliklari:
  • Ko'p tarmoqli muhitda yomon ishlash

Ajoyib! Uchinchi dasturda biz ip xavfsizligini qaytardik! To'g'ri, bu sekin ... Endi usul getInstancesinxronlashtirildi va siz uni bir vaqtning o'zida kiritishingiz mumkin. Aslida, biz butun usulni sinxronlashtirishimiz shart emas, faqat uning yangi sinf ob'ektini ishga tushiradigan qismi. Lekin biz yangi ob'ektni yaratish uchun mas'ul bo'lgan qismni oddiygina blokga o'ra olmaymiz synchronized: bu ip xavfsizligini ta'minlamaydi. Bu biroz murakkabroq. To'g'ri sinxronlash usuli quyida keltirilgan:

Ikki marta tekshirilgan qulflash

public class Singleton {
    private static Singleton INSTANCE;

  private Singleton() {
  }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
Taroziga soling:
  • Dangasa ishga tushirish.

  • Ip xavfsizligi

  • Ko'p tarmoqli muhitda yuqori ishlash

Kamchiliklari:
  • Java 1.5 dan past versiyalarida qoʻllab-quvvatlanmaydi (uchuvchi kalit soʻz 1.5 versiyada oʻrnatildi)

Shuni ta'kidlaymanki, ushbu amalga oshirish variantining to'g'ri ishlashi uchun ikkita shartdan biri talab qilinadi. O'zgaruvchi yoki yoki INSTANCEbo'lishi kerak . Biz bugun muhokama qiladigan oxirgi dastur . finalvolatileClass Holder Singleton

Sinf egasi Singleton

public class Singleton {

   private Singleton() {
   }

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

   public static Singleton getInstance() {
       return SingletonHolder.HOLDER_INSTANCE;
   }
}
Taroziga soling:
  • Dangasa ishga tushirish.

  • Ip xavfsizligi.

  • Ko'p tarmoqli muhitda yuqori ishlash.

Kamchiliklari:
  • SingletonTo'g'ri ishlashi uchun sinf ob'ekti xatosiz ishga tushirilishini kafolatlash kerak . Aks holda, birinchi usul chaqiruvi getInstancexato bilan tugaydi ExceptionInInitializerErrorva keyingi barchalari muvaffaqiyatsiz bo'ladi NoClassDefFoundError.

Amalga oshirish deyarli mukammaldir. Va dangasa, ipdan xavfsiz va tez. Ammo minusda tasvirlangan nuance bor. Singleton naqshining turli xil ilovalarini taqqoslash jadvali:
Amalga oshirish Dangasa ishga tushirish Ip xavfsizligi Ko'p tarmoqli tezligi Qachon foydalanish kerak?
Oddiy yechim - + Tez Hech qachon. Yoki dangasa ishga tushirish muhim bo'lmaganda. Lekin hech qachon yaxshiroq.
Lazy Initialization + - Qo'llanilmaydigan, qo'llab bo'lmaydigan Har doim multithreading kerak bo'lmaganda
Sinxronlashtirilgan aksessuarlar + + Sekin-asta Hech qachon. Yoki multithreading bilan ishlash tezligi muhim emas. Lekin hech qachon yaxshiroq
Ikki marta tekshirilgan qulflash + + Tez Singleton yaratishda istisnolardan foydalanish kerak bo'lgan kamdan-kam hollarda. (Agar Class Holder Singleton qo'llanilmasa)
Sinf egasi Singleton + + Tez Har doim multithreading kerak bo'lganda va singleton sinf ob'ekti muammosiz yaratilishiga kafolat mavjud.

Singleton naqshining ijobiy va salbiy tomonlari

Umuman olganda, singleton undan kutilgan narsani aniq bajaradi:
  1. Sinfning faqat bitta nusxasiga ega bo'lishiga kafolat beradi.

  2. Ushbu sinf namunasiga global kirish nuqtasini taqdim etadi.

Biroq, bu modelning kamchiliklari bor:
  1. Singleton SRP (Single Responsibility Principle) ni buzadi - Singleton klassi o'zining bevosita mas'uliyatidan tashqari, uning nusxalari sonini ham nazorat qiladi.

  2. Muntazam sinf yoki usulning singletonga bog'liqligi sinfning ommaviy shartnomasida ko'rinmaydi.

  3. Global o'zgaruvchilar yomon. Singleton oxir-oqibat bitta katta global o'zgaruvchiga aylanadi.

  4. Singletonning mavjudligi umuman dasturning sinovdan o'tish qobiliyatini va xususan, singletondan foydalanadigan sinflarni kamaytiradi.

OK, endi hammasi tugadi. Biz singleton dizayn naqshini ko'rib chiqdik. Endi, dasturchi do'stlaringiz bilan umrbod suhbatda siz nafaqat uning yaxshi tomonlarini, balki uning yomon tomoni haqida ham bir necha so'z ayta olasiz. Yangi bilimlarni o'zlashtirishda omad tilaymiz.

Qo'shimcha o'qish:

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION