JavaRush /Java Blog /Random-TK /Dizaýn nagyşlary: Singleton

Dizaýn nagyşlary: Singleton

Toparda çap edildi
Salam! Bu gün dürli dizaýn nagyşlaryna has içgin serederis we “singleton” diýlip atlandyrylýan Singleton nagşy bilen başlarys. Dizaýn nagyşlary: Singleton - 1Rememberatda saklalyň: umuman dizaýn nagyşlary barada näme bilýäris? Dizaýn nagyşlary, belli bolan birnäçe meseläni çözmek üçin ýerine ýetirilip bilinjek iň oňat tejribe. Dizaýn nagyşlary, adatça, haýsydyr bir programma dili bilen baglanyşykly däl. Mistakesalňyşlyklardan gaça durup, tigiriňizi täzeden dikeldip bolmajak maslahatlar toplumy hökmünde kabul ediň.

Singleton näme?

Singleton, synpda ulanyp boljak iň ýönekeý dizaýn nagyşlaryndan biridir. Adamlar käwagt “bu synp ýeketäk” diýýärler, bu synpyň ýeke-täk dizaýn nusgasyny durmuşa geçirýändigini aňladýar. Käwagt diňe bir obýektiň döredilip bilinjek synpyny ýazmaly bolýar. Mysal üçin, maglumat bazasyna girmek ýa-da birikmek üçin jogapkär synp. “Singleton” dizaýn nagşy, şeýle meseläni nädip ýerine ýetirip biljekdigimizi suratlandyrýar. Singleton iki zady ýerine ýetirýän dizaýn nagşydyr:
  1. Bir synpyň synpyň diňe bir mysaly boljakdygyna kepillik berýär.

  2. Bu synpyň mysalynda global giriş nokadyny üpjün edýär.

Şeýlelik bilen, ýeketäk nagşyň her ýerine ýetirilişine diýen ýaly häsiýet berýän iki aýratynlyk bar:
  1. Hususy konstruktor. Synpyň daşynda synp obýektlerini döretmek ukybyny çäklendirýär.

  2. Synpyň mysalyny görkezýän köpçülikleýin statiki usul. Bu usul diýilýär getInstance. Bu synp mysalyna global giriş nokady.

Durmuşa geçirmegiň wariantlary

Singleton dizaýn nagşy dürli usullarda ulanylýar. Her bir warianty gowy we erbet. Bu ýerde, hemişe bolşy ýaly: ideal ýok, ýöne munuň üçin ymtylmaly. Allöne ilki bilen haýsynyň gowy, nämäniň erbetdigini we dizaýn ölçeginiň durmuşa geçirilişine baha bermegiň haýsy ölçeglere täsir edýändigini kesgitläliň. Oňynlardan başlalyň. Ine, ýerine ýetiriş şiresi we özüne çekiji ölçegler:
  • Azyalta başlangyç: programma zerur wagty işleýän wagtynda synp ýüklenende.

  • Koduň ýönekeýligi we aýdyňlygy: ölçeg, elbetde, subýektiw, ýöne möhümdir.

  • Sapagyň howpsuzlygy: köp sapakly gurşawda dogry işleýär.

  • Köp sapakly gurşawda ýokary öndürijilik: çeşmeler paýlaşylanda sapaklar biri-birini minimal bloklaýar ýa-da asla ýok.

Indi zyýany. Theerine ýetirilişini erbet ýagdaýda görkezýän ölçegleri sanap geçeliň:
  • Yalta däl başlangyç: programma başlanda, zerur ýa-da ýokdugyna garamazdan synp ýüklenende (paradoks, IT dünýäsinde ýalta bolmak has gowudyr)

  • Koduň çylşyrymlylygy we okalmazlygy. Metrik hem subýektiw. Gan gözlerden gelýän bolsa, ýerine ýetiriş şeýle diýeris.

  • Saplaryň howpsuzlygynyň bolmazlygy. Başgaça aýdylanda, “sapak howpy”. Köp sapakly gurşawda nädogry işlemek.

  • Köp sapakly gurşawda pes öndürijilik: sapaklar hemişe ýa-da çeşme paýlaşylanda biri-birini ýapýar.

Kod

Indi oňaýly we zyýanly taraplaryny sanap, durmuşa geçirmegiň dürli wariantlaryna garamaga taýyn:

Pleönekeý çözgüt

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

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
Iň ýönekeý durmuşa geçirmek. Taraz:
  • Koduň ýönekeýligi we aýdyňlygy

  • Tekstiň howpsuzlygy

  • Köp sapakly gurşawda ýokary öndürijilik

Minuslar:
  • Yalta başlangyç däl.
Iň soňky kemçiligi düzetmek üçin iki sany ýerine ýetiriş alarys:

Yalta başlangyç

public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Taraz:
  • Yalta başlangyç.

Minuslar:
  • Threadüplük howpsuz däl

Durmuşa geçirmek gyzykly. Lazaltalyk bilen başlap bileris, ýöne sapak howpsuzlygyny ýitirdik. Mesele ýok: üçünji belgili durmuşa geçirişde hemme zady sinhronlaşdyrýarys.

Sinhronlaşdyrylan aksesuar

public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Taraz:
  • Yalta başlangyç.

  • Tekstiň howpsuzlygy

Minuslar:
  • Köp sapakly gurşawda pes öndürijilik

Gowy! Üçünji belgili ýerine ýetirişde, sapak howpsuzlygyny yzyna getirdik! Dogry, haýal ... Indi usul getInstancesinhronlaşdyryldy we ony diňe bir gezek girizip bilersiňiz. Aslynda, tutuş usuly sinhronlamak zerurlygy ýok, diňe täze synp obýektini başlaýan bölegimiz. synchronizedSimplyöne täze bir obýekt döretmek üçin jogapkär bölegi blokda örtüp bilmeris : bu sapak howpsuzlygyny üpjün etmeýär. Biraz çylşyrymly. Dogry sinhronizasiýa usuly aşakda berilýär:

Iki gezek barlanan gulplama

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;
    }
}
Taraz:
  • Yalta başlangyç.

  • Tekstiň howpsuzlygy

  • Köp sapakly gurşawda ýokary öndürijilik

Minuslar:
  • 1.5-den pes Java wersiýalarynda goldanylmaýar (üýtgäp durýan açar söz 1.5 wersiýada düzedildi)

Bu ýerine ýetiriş opsiýasynyň dogry işlemegi üçin iki şertden biriniň zerurdygyny belläp geçýärin. Üýtgeýji ýa-da INSTANCEbolmaly . Bu gün ara alyp maslahatlaşjak iň soňky durmuşa geçirişimiz . finalvolatileClass Holder Singleton

Synp eýesi 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;
   }
}
Taraz:
  • Yalta başlangyç.

  • Tekstiň howpsuzlygy.

  • Köp sapakly gurşawda ýokary öndürijilik.

Minuslar:
  • SingletonDogry işlemek üçin synp obýektiniň ýalňyşsyz başlamagyny kepillendirmek zerurdyr . Otherwiseogsam, ilkinji usul jaňy getInstanceýalňyşlyk bilen gutarar ExceptionInInitializerErrorwe indiki çagyryşlaryň hemmesi şowsuz bolar NoClassDefFoundError.

Durmuşa geçirmek gaty gowy. Yalta, sapakdan ygtybarly we çalt. Theöne minusda beýan edilen bir nuans bar. “Singleton” nagşynyň dürli ýerine ýetirilişiniň deňeşdirme tablisasy:
Durmuşa geçirmek Yalta başlangyç Tekstiň howpsuzlygy Köp okalýan tizlik Haçan ulanmaly?
Pleönekeý çözgüt - + Çalt Hiç haçan. Ora-da ýalta başlangyç möhüm däl bolsa. Neveröne hiç haçan gowy däl.
Yalta başlangyç + - Ulanylmaýar Elmydama köp okamagyň zerurlygy ýok wagty
Sinhronlaşdyrylan aksesuar + + Lyuwaş-ýuwaşdan Hiç haçan. Ora-da köp okamak bilen işiň tizliginiň ähmiýeti ýok. Neveröne hiç haçan gowy däl
Iki gezek barlanan gulplama + + Çalt Seýrek ýagdaýlarda, ýekeje aýdym döredilende kadadan çykmalary çözmeli bolarsyňyz. (“Class Holder Singleton” ulanylmasa)
Synp eýesi Singleton + + Çalt Elmydama köp okamak zerur bolanda we ýekeje synp obýektiniň kynçylyksyz dörediljekdigine kepillik bar.

Singleton nagşynyň oňaýly taraplary

Umuman aýdanyňda, singleton garaşylýan zady ýerine ýetirýär:
  1. Bir synpyň synpyň diňe bir mysaly boljakdygyna kepillik berýär.

  2. Bu synpyň mysalynda global giriş nokadyny üpjün edýär.

Şeýle-de bolsa, bu nagşyň kemçilikleri bar:
  1. Singleton SRP-ni (leeke-täk jogapkärçilik ýörelgesi) bozýar - Singleton synpy, derrew jogapkärçiliklerinden başga-da, göçürmeleriniň sanyna hem gözegçilik edýär.

  2. Adaty synpyň ýa-da usulyň ýeke-täklige baglylygy synpyň jemgyýetçilik şertnamasynda görünmeýär.

  3. Global üýtgeýjiler erbet. Singleton ahyrsoňy bir uly global üýtgeýjä öwrülýär.

  4. Singleton-yň bolmagy, umuman, programmanyň we esasanam singleton ulanýan synplaryň synag ukyplylygyny peseldýär.

Bolýar, indi gutardy. Singleton dizaýnyna göz aýladyk. Indi, programmist dostlaryňyz bilen durmuş üçin geçirilen söhbetdeşlikde diňe bir gowy zady däl, eýsem erbet tarapy hakda birnäçe söz hem aýdyp bilersiňiz. Täze bilimleri özleşdirmekde üstünlik.

Goşmaça okamak:

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