logo

Vzorec načrtovanja metode Singleton

Singleton Pattern je verjetno najpogosteje uporabljen vzorec oblikovanja. Je preprost vzorec, enostaven za razumevanje in uporabo. Včasih se uporablja v presežku in v scenarijih, kjer ni potreben. V takšnih primerih so slabosti njegove uporabe večje od prednosti, ki jih prinaša. Zaradi tega se vzorec enega samca včasih obravnava kot antipattern ali vzorec singleton .

Singleton-method-design-pattern



Pomembne teme za vzorec načrtovanja metode Singleton

1. Kaj je vzorec načrtovanja metode Singleton?

Metoda Singleton ali vzorec Singleton Design je eden najpreprostejših vzorcev oblikovanja. Zagotavlja, da ima razred samo en primerek in zagotavlja globalno točko dostopa do njega.

2. Kdaj uporabiti vzorec načrtovanja metode Singleton?

Uporabite vzorec oblikovanja metode Singleton, kadar:



generator naključnih vrednosti v Javi
  • Obstajati mora natanko en primerek razreda in mora biti dostopen odjemalcem iz dobro znane dostopne točke.
  • Ko mora biti edini primerek razširljiv s podrazredi in odjemalci morajo imeti možnost uporabljati razširjeni primerek brez spreminjanja
  • Razredi Singleton se uporabljajo za beleženje, objekte gonilnikov, predpomnjenje in področje niti, povezave z bazo podatkov.

3. Inicializacijske vrste singla

Razred Singleton je mogoče instancirati z dvema metodama:

kako naj ugotovim velikost svojega monitorja
  • Zgodnja inicializacija: Pri tej metodi se razred inicializira, ne glede na to, ali naj se uporablja ali ne. Glavna prednost te metode je njena preprostost. Razred začnete v času nalaganja razreda. Njegova pomanjkljivost je, da se razred vedno inicializira, ne glede na to, ali se uporablja ali ne.
  • Lena inicializacija: Pri tej metodi se razred inicializira le, ko je to potrebno. Lahko vas reši pred instanciranjem razreda, ko ga ne potrebujete. Na splošno se lena inicializacija uporablja, ko ustvarimo razred singleton.

4. Ključna komponenta vzorca načrtovanja metode Singleton:

Key-Component-of-Singleton-Method-Design-Pattern-(1)

4.1. Statični član:

Vzorec Singleton ali vzorec Singleton uporablja statičnega člana znotraj razreda. Ta statični član zagotavlja, da je pomnilnik dodeljen samo enkrat, pri čemer se ohrani en sam primerek razreda Singleton.



Java
// Static member to hold the single instance private static Singleton instance;>

4.2. Zasebni graditelj:

Vzorec Singleton ali vzorec Singleton vključuje zasebni konstruktor, ki služi kot barikada pred zunanjimi poskusi ustvarjanja primerkov razreda Singleton. To zagotavlja, da ima razred nadzor nad svojim postopkom instanciranja.

Java
// Private constructor to // prevent external instantiation class Singleton {  // Making the constructor as Private  private Singleton()  {  // Initialization code here  } }>

4.3. Statična tovarniška metoda:

Ključni vidik vzorca Singleton je prisotnost statične tovarniške metode. Ta metoda deluje kot prehod, ki zagotavlja globalno točko dostopa do objekta Singleton. Ko nekdo zahteva primerek, ta metoda ustvari nov primerek (če ta ne obstaja) ali vrne obstoječi primerek klicatelju.

Java
// Static factory method for global access public static Singleton getInstance() {  // Check if an instance exists  if (instance == null) {  // If no instance exists, create one  instance = new Singleton();  }  // Return the existing instance  return instance; }>

5. Implementacija vzorca načrtovanja metode Singleton

Implementacija načrtovalnega vzorca Singleton ali Pattern Singleton je opisana v naslednjem diagramu razredov:

Posnetek zaslona-2023-12-07-174635

Implementacija vzorca načrtovanja metode Singleton

statična java

Izvedba vzorca singleton Design je zelo preprosta in je sestavljena iz enega razreda. Da bi zagotovili, da je primerek singleton edinstven, morajo biti vsi konstruktorji singletona zasebni. Globalni dostop se izvaja prek statične metode, do katere je mogoče globalno dostopati do enega primerka, kot je prikazano v kodi.

Java
/*package whatever //do not write package name here */ import java.io.*; class Singleton {  // static class  private static Singleton instance;  private Singleton()  {  System.out.println('Singleton is Instantiated.');  }  public static Singleton getInstance()  {  if (instance == null)  instance = new Singleton();  return instance;  }  public static void doSomething()  {  System.out.println('Somethong is Done.');  } } class GFG {  public static void main(String[] args)  {  Singleton.getInstance().doSomething();  } }>

Izhod
Singleton is Instantiated. Somethong is Done.>

Z metodo getInstance preverimo, ali je instanca ničelna. Če primerek ni ničelna, to pomeni, da je bil objekt ustvarjen prej; drugače ga ustvarimo z uporabo operatorja new.

6. Različni načini implementacije vzorca načrtovanja metode Singleton

Včasih moramo imeti samo en primerek našega razreda, na primer eno samo povezavo DB, ki si jo deli več objektov, saj je ustvarjanje ločene povezave DB za vsak objekt lahko drago. Podobno lahko v aplikaciji obstaja en sam upravljalnik konfiguracije ali upravljalnik napak, ki obravnava vse težave, namesto da bi ustvaril več upraviteljev.

Klasična izvedba

Oglejmo si različne možnosti oblikovanja za izvedbo takšnega razreda. Če dobro obvladate statične spremenljivke razreda in modifikatorje dostopa, to ne bi smela biti težka naloga.

string.compare c#

Metoda 1 – klasična izvedba || Naj bo getInstance() statičen za implementacijo Vzorec načrtovanja metode Singleton

Java
// Classical Java implementation of singleton // design pattern class Singleton {  private static Singleton obj;  // private constructor to force use of  // getInstance() to create Singleton object  private Singleton() {}  public static Singleton getInstance()  {  if (obj == null)  obj = new Singleton();  return obj;  } }>

Tukaj smo izjavili getInstance() statičen, tako da ga lahko pokličemo brez instanciranja razreda. Prvič getInstance() se imenuje, ustvari nov enojni objekt in po tem samo vrne isti objekt.

Opomba: Singleton obj ni ustvarjen, dokler ga ne potrebujemo in pokličemo getInstance() metoda. To se imenuje lena instancacija. Glavna težava zgornje metode je, da ni varna za niti. Razmislite o naslednjem zaporedju izvajanja.

To zaporedje izvajanja ustvari dva predmeta za enojno datoteko. Zato ta klasična izvedba ni varna za niti.

Metoda 2 || Naj bo getInstance() sinhroniziran za implementacijo Vzorec načrtovanja metode Singleton

Java
// Thread Synchronized Java implementation of // singleton design pattern class Singleton {  private static Singleton obj;  private Singleton() {}  // Only one thread can execute this at a time  public static synchronized Singleton getInstance()  {  if (obj == null)  obj = new Singleton();  return obj;  } }>

Tu uporaba sinhroniziranega zagotavlja, da se lahko izvaja samo ena nit naenkrat getInstance() . Glavna pomanjkljivost te metode je, da je uporaba sinhroniziranega vsakič med ustvarjanjem posameznega predmeta draga in lahko zmanjša učinkovitost vašega programa. Če pa je uspešnost getInstance() ni ključnega pomena za vašo aplikacijo, ta metoda zagotavlja čisto in preprosto rešitev.

Metoda 3 – Nestrpna instancacija || Izvedba vzorca načrtovanja z enim samim elementom, ki temelji na statičnem inicializatorju

Java
// Static initializer based Java implementation of // singleton design pattern class Singleton {  private static Singleton obj = new Singleton();  private Singleton() {}  public static Singleton getInstance() { return obj; } }>

Tukaj smo ustvarili primerek singla v statičnem inicializatorju. JVM izvede statični inicializator, ko je razred naložen, zato je zajamčeno, da je varen za niti. To metodo uporabite le, če je vaš razred singleton lahek in se uporablja skozi celotno izvajanje vašega programa.

4. način – najučinkovitejši || Uporabite dvojno preverjeno zaklepanje za implementacijo enojnega načrtovalnega vzorca

Če pozorno opazite, ko je objekt ustvarjen, sinhronizacija ni več uporabna, ker zdaj obj ne bo ničelna in bo vsako zaporedje operacij vodilo do doslednih rezultatov. Torej bomo pridobili zaklepanje getInstance() samo enkrat, ko je obj nič. Na ta način sinhroniziramo samo prvo pot skozi, kar želimo.

java generator naključnih števil
Java
// Double Checked Locking based Java implementation of // singleton design pattern class Singleton {  private static volatile Singleton obj = null;  private Singleton() {}  public static Singleton getInstance()  {  if (obj == null) {  // To make thread safe  synchronized (Singleton.class)  {  // check again as multiple threads  // can reach above step  if (obj == null)  obj = new Singleton();  }  }  return obj;  } }>

Razglasili smo obj hlapljivo ki zagotavlja, da več niti pravilno ponudi spremenljivko obj, ko je inicializirana v primerku Singleton. Ta metoda drastično zmanjša stroške vsakokratnega klica sinhronizirane metode.

7. Primer uporabe metode Pattern Singleton

  • Povezave z bazo podatkov: V aplikacijah, kjer je ustvarjanje in upravljanje povezav z bazo podatkov draga operacija, se lahko uporabi Singleton za vzdrževanje ene same povezave z bazo podatkov v celotni aplikaciji.
  • Upravljanje konfiguracije: Ko imate globalne konfiguracijske nastavitve, do katerih morajo dostopati različne komponente aplikacije, lahko upravitelj konfiguracije Singleton zagotovi eno samo točko dostopa do teh nastavitev.
  • Komponente GUI: Za komponente ali krmilnike grafičnega uporabniškega vmesnika (GUI) lahko Singleton pomaga pri upravljanju stanja in dejanj uporabniškega vmesnika ter zagotavlja enotno točko nadzora.
  • Upravitelji naprav: V vgrajenih sistemih ali aplikacijah, ki medsebojno delujejo s strojnimi napravami, se lahko uporabi Singleton za upravljanje in nadzor dostopa do strojnih naprav, da se izognete konfliktom.
  • Storitev tiskanja: V sistemih, ki vključujejo tiskanje dokumentov ali poročil, lahko storitev tiskanja Singleton usklajuje in upravlja tiskalna opravila, kar zagotavlja učinkovito uporabo virov tiskanja.

8. Prednosti vzorca načrtovanja metode Singleton:

  • Rešuje trke imen: V scenarijih, kjer je potrebna ena sama točka nadzora, da bi se izognili sporom ali trkom pri poimenovanju, vzorec Singleton zagotavlja, da obstaja samo en primerek z edinstvenim imenom.
  • Nestrpna ali lena inicializacija: Vzorec Singleton podpira tako željno inicializacijo (ustvarjanje primerka, ko je razred naložen) kot leno inicializacijo (ustvarjanje primerka, ko je prvič zahtevan), kar zagotavlja prilagodljivost glede na primer uporabe.
  • Varnost niti: Pravilno implementirani vzorci Singleton lahko zagotovijo varnost niti, saj zagotovijo, da je primerek ustvarjen atomsko in da več niti nenamerno ne ustvari podvojenih primerkov.
  • Zmanjšan pomnilniški odtis: V aplikacijah, kjer je poraba virov kritična, lahko vzorec Singleton prispeva k zmanjšanju pomnilniškega odtisa, tako da zagotovi, da obstaja samo en primerek razreda.

9. Slabosti Singleton Design Pattern

  • Težave pri testiranju: Ker Singletoni uvajajo globalno stanje, lahko testiranje enot postane izziv. Preizkušanje ene komponente v izolaciji je lahko bolj zapleteno, če se zanaša na singlton, saj lahko stanje singltona vpliva na izid testov.
  • Težave s sočasnostjo: V večnitnem okolju lahko pride do težav, povezanih z ustvarjanjem in inicializacijo primerka Singleton. Če poskuša več niti hkrati ustvariti Singleton, lahko to povzroči pogoje tekmovanja.
  • Omejena razširljivost: Vzorec Singleton lahko naredi kodo manj razširljivo. Če se pozneje odločite, da potrebujete več primerkov razreda ali želite spremeniti logiko instanciranja, bo morda potrebno znatno preoblikovanje.
  • Globalna odvisnost: Vzorec Singleton ustvari globalno odvisnost, zaradi česar je težje zamenjati Singleton z alternativno izvedbo ali uporabiti vbrizgavanje odvisnosti za zagotavljanje primerkov.
  • Težko podrazred: Podrazred Singleton je lahko izziv. Ker je konstruktor običajno zaseben, je za razširitev Singletona potrebna dodatna skrb in morda ne sledi standardnim vzorcem dedovanja.
  • Upravljanje življenjskega cikla: Vzorec Singleton morda ne bo obravnaval scenarijev, kjer je treba primerek izrecno uničiti ali ponastaviti. Upravljanje življenjskega cikla Singletona lahko postane skrb.
  • Zloraba globalne dostopne točke: Čeprav je globalna dostopna točka prednost, jo je mogoče tudi zlorabiti. Razvijalce bi lahko zamikalo, da bi uporabili Singleton za vse, kar bi privedlo do pretirane uporabe globalnega stanja in manj modularne zasnove.

10. Zaključek

Za nekatere razrede je pomembno, da imajo točno en primerek. Čeprav je lahko v sistemu veliko tiskalnikov, mora biti samo en tiskalnik v ozadju. Obstajati mora samo en datotečni sistem in en upravitelj oken. Digitalni filter bo imel en A/D pretvornik. Računovodski sistem bo namenjen enemu podjetju. Kako zagotovimo, da ima razred samo eno instanco in da je lahko dostopna? Globalna spremenljivka naredi objekt dostopen, vendar vam ne preprečuje instanciranja več objektov.

Boljša rešitev je, da je razred sam odgovoren za spremljanje svojega edinega primerka. Razred lahko zagotovi, da ni mogoče ustvariti nobenega drugega primerka (s prestrezanjem zahtev za ustvarjanje novih objektov), ​​in lahko zagotovi način za dostop do primerka. To je vzorec Singleton.