„Singleton Pattern“ yra bene plačiausiai naudojamas dizaino modelis. Tai paprastas modelis, lengvai suprantamas ir naudojamas. Kartais jis naudojamas per daug ir tais atvejais, kai to nereikia. Tokiais atvejais jo naudojimo trūkumai nusveria jo teikiamus privalumus. Dėl šios priežasties vienkartinis modelis kartais laikomas antipattern arba modelio viengubas .
kaip konvertuoti int į java eilutę
Svarbios Singleton metodo projektavimo modelio temos
- Kas yra Singleton metodo dizaino modelis?
- Kada naudoti „Singleton“ metodo dizaino modelį?
- Singletono inicijavimo tipai
- Pagrindinis „Singleton“ metodo projektavimo modelio komponentas:
- Singleton metodo projektavimo modelio įgyvendinimas
- Įvairūs Singleton metodo projektavimo modelio įgyvendinimo būdai
- Singleton metodo naudojimo atvejis
- Singleton metodo dizaino modelio pranašumai:
- „Singleton“ dizaino modelio trūkumai
1. Kas yra Singleton Method Design Pattern?
Singleton metodas arba Singleton Design modelis yra vienas iš paprasčiausių dizaino modelių. Tai užtikrina, kad klasė turi tik vieną egzempliorių, ir suteikia visuotinį prieigos prie jos tašką.

2. Kada naudoti Singleton Method Design Pattern?
Naudokite Singleton metodo dizaino modelį, kai:
- Turi būti tiksliai vienas klasės egzempliorius ir jis turi būti pasiekiamas klientams iš gerai žinomo prieigos taško.
- Kai vienintelis egzempliorius turėtų būti išplečiamas subklasifikuojant, o klientai turėtų turėti galimybę naudoti išplėstinį egzempliorių nekeičiant
- Singleton klasės naudojamos registravimui, tvarkyklių objektams, talpyklai ir gijų telkiniui, duomenų bazių ryšiams.
3. Singletono inicijavimo tipai
„Singleton“ klasę galima sukurti dviem būdais:
- Ankstyvas inicijavimas: Taikant šį metodą, klasė inicijuojama, nesvarbu, ar ji bus naudojama, ar ne. Pagrindinis šio metodo pranašumas yra jo paprastumas. Kursą inicijuojate klasės įkėlimo metu. Jo trūkumas yra tas, kad klasė visada inicijuojama, nesvarbu, ar ji naudojama, ar ne.
- Tingus inicijavimas: Taikant šį metodą, klasė inicijuojama tik tada, kai to reikia. Tai gali išgelbėti jus nuo klasės egzempliorių, kai jums to nereikia. Paprastai tingus inicijavimas naudojamas, kai sukuriame vienos klasės klasę.
4. Pagrindinis Singleton metodo projektavimo modelio komponentas:
string.substring java
4.1. Statinis narys:
Singleton modelis arba modelis Singleton klasėje naudoja statinį narį. Šis statinis narys užtikrina, kad atmintis būtų skirta tik vieną kartą, išsaugant vieną Singleton klasės egzempliorių.
Java
// Static member to hold the single instance private static Singleton instance;>
4.2. Privatus konstruktorius:
„Singleton“ raštas arba „singleton“ šablonas apima privatų konstruktorių, kuris tarnauja kaip barikada nuo išorinių bandymų sukurti „Singleton“ klasės egzempliorius. Tai užtikrina, kad klasė gali kontroliuoti savo egzempliorių procesą.
Java // Private constructor to // prevent external instantiation class Singleton { // Making the constructor as Private private Singleton() { // Initialization code here } }>
4.3. Statinis gamyklinis metodas:
Esminis Singleton modelio aspektas yra statinio gamyklos metodo buvimas. Šis metodas veikia kaip šliuzas, suteikiantis visuotinį prieigos prie Singleton objekto tašką. Kai kas nors prašo egzemplioriaus, šis metodas sukuria naują egzempliorių (jei jo nėra) arba grąžina esamą egzempliorių skambintojui.
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. Singleton metodo projektavimo modelio įgyvendinimas
„Singleton“ dizaino modelio arba „Singleton“ modelio įgyvendinimas aprašytas šioje klasių diagramoje:

Singleton metodo projektavimo modelio įgyvendinimas
„Singleton Design“ modelio įgyvendinimas yra labai paprastas ir susideda iš vienos klasės. Siekiant užtikrinti, kad vienkartinis egzempliorius būtų unikalus, visi vienetiniai konstruktoriai turėtų būti privatūs. Visuotinė prieiga atliekama naudojant statinį metodą, kuris gali būti visuotinai pasiekiamas prie vieno egzemplioriaus, kaip parodyta kode.
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(); } }>
Išvestis
Singleton is Instantiated. Somethong is Done.>
Naudodami getInstance metodą patikriname, ar egzempliorius yra nulinis. Jei egzempliorius nėra nulinis, tai reiškia, kad objektas buvo sukurtas anksčiau; kitu atveju sukuriame jį naudodami naują operatorių.
6. Skirtingi Singleton metodo projektavimo modelio įgyvendinimo būdai
Kartais mums reikia turėti tik vieną mūsų klasės egzempliorių, pavyzdžiui, vieną DB ryšį, kurį bendrina keli objektai, nes sukurti atskirą DB ryšį kiekvienam objektui gali būti brangu. Panašiai programoje gali būti vienas konfigūracijos tvarkytuvas arba klaidų tvarkyklė, kuri sprendžia visas problemas, o ne sukuria kelis valdytojus.
kaip pervardyti katalogą linux
Pažiūrėkime į įvairius dizaino variantus, kaip įgyvendinti tokią klasę. Jei gerai valdote statinius klasės kintamuosius ir prieigos modifikatorius, tai neturėtų būti sudėtinga užduotis.
1 metodas – klasikinis įgyvendinimas || Padarykite getInstance() statinį, kad galėtumėte įgyvendinti Singleton metodo dizaino modelis
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; } }>
Čia mes paskelbėme getInstance () statinis, kad galėtume jį pavadinti nesukurdami klasės. Pirmasis kartas getInstance () vadinamas jis sukuria naują pavienį objektą ir po to tiesiog grąžina tą patį objektą.
Pastaba: Singleton obj nesukuriamas tol, kol mums jo nereikia ir nepakviečiame getInstance () metodas. Tai vadinama tingiu egzistavimu. Pagrindinė aukščiau pateikto metodo problema yra ta, kad jis nėra saugus siūlams. Apsvarstykite sekančią vykdymo seką.
css sąrašus
Ši vykdymo seka sukuria du viengubo objektus. Todėl šis klasikinis įgyvendinimas nėra saugus.
2 metodas || Sinchronizuokite getInstance(), kad būtų galima įdiegti Singleton metodo dizaino modelis
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; } }>
Čia naudojant sinchronizuotą užtikrinama, kad vienu metu gali būti vykdoma tik viena gija getInstance () . Pagrindinis šio metodo trūkumas yra tas, kad sinchronizavimo naudojimas kiekvieną kartą kuriant pavienį objektą yra brangus ir gali sumažinti jūsų programos našumą. Tačiau, jei atlikimas getInstance () nėra labai svarbus jūsų programai, šis metodas yra švarus ir paprastas sprendimas.
3 metodas – Nekantrus instancija || Statiniu iniciatoriumi pagrįstas viengubo dizaino modelio įgyvendinimas
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; } }>
Čia sukūrėme viengubo pavyzdį statiniame iniciatoriuje. JVM vykdo statinį iniciatorių, kai klasė įkeliama, todėl garantuojama, kad tai bus saugi. Naudokite šį metodą tik tada, kai jūsų viengubo klasė yra lengva ir naudojama viso jūsų programos vykdymo metu.
4 metodas – veiksmingiausias || Naudokite dvigubai patikrintą užraktą, kad įgyvendintumėte vieno dizaino modelį
Jei atidžiai pastebėsite, kai objektas bus sukurtas, sinchronizavimas nebebus naudingas, nes dabar obj nebus nulinis ir bet kokia operacijų seka duos nuoseklius rezultatus. Taigi getInstance() užraktą gausime tik vieną kartą, kai obj yra nulinis. Tokiu būdu mes sinchronizuojame tik pirmąjį kelią, tik tai, ko norime.
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; } }>
Mes paskelbėme obj nepastovios kuri užtikrina, kad kelios gijos tinkamai pasiūlys obj kintamąjį, kai jis inicijuojamas į Singleton egzempliorių. Šis metodas drastiškai sumažina kiekvieną kartą iškviečiant sinchronizuotą metodą išlaidas.
7. Singletono modelio metodo naudojimo atvejis
- Duomenų bazių jungtys: Programose, kuriose duomenų bazių jungčių kūrimas ir valdymas yra brangi operacija, Singleton gali būti naudojamas palaikyti vieną duomenų bazės ryšį visoje programoje.
- Konfigūracijos valdymas: Kai turite visuotinius konfigūracijos nustatymus, kuriuos turi pasiekti įvairūs programos komponentai, Singleton konfigūracijos tvarkyklė gali suteikti vieną prieigos prie šių parametrų tašką.
- GUI komponentai: Grafinės vartotojo sąsajos (GUI) komponentams ar valdikliams Singleton gali padėti valdyti vartotojo sąsajos būseną ir veiksmus, suteikdamas vieną valdymo tašką.
- Įrenginių valdytojai: Įterptosiose sistemose arba programose, sąveikaujančiose su aparatūros įrenginiais, Singleton gali būti naudojamas valdyti ir valdyti prieigą prie aparatūros įrenginių, kad būtų išvengta konfliktų.
- Spausdinimo paslauga: Sistemose, kuriose spausdinami dokumentai ar ataskaitos, Singleton spausdinimo tarnyba gali koordinuoti ir valdyti spausdinimo užduotis, užtikrindama efektyvų spausdinimo išteklių naudojimą.
8. Singleton metodo projektavimo modelio privalumai:
- Išsprendžia vardų susidūrimus: Tais atvejais, kai reikia vieno valdymo taško, kad būtų išvengta pavadinimų konfliktų ar susidūrimų, Singleton modelis užtikrina, kad būtų tik vienas egzempliorius su unikaliu pavadinimu.
- Noras arba tingus inicijavimas: „Singleton“ šablonas palaiko tiek veržlų inicijavimą (pavyzdžio kūrimas, kai klasė įkeliama), ir tingią inicijavimą (egzemplioriaus kūrimas, kai jo pirmą kartą prašoma), suteikdamas lankstumo, atsižvelgiant į naudojimo atvejį.
- Siūlų sauga: Tinkamai įgyvendinti Singleton šablonai gali užtikrinti gijų saugumą, užtikrinant, kad egzempliorius būtų sukurtas atomiškai ir kad kelios gijos netyčia nesukurtų pasikartojančių egzempliorių.
- Sumažintas atminties plotas: Programose, kuriose išteklių sunaudojimas yra labai svarbus, Singleton modelis gali padėti sumažinti atminties kiekį, nes užtikrina, kad yra tik vienas klasės egzempliorius.
9. Singleton dizaino modelio trūkumai
- Bandymo sunkumai: Kadangi Singletons pristato pasaulinę būseną, vienetų testavimas gali tapti sudėtingas. Vieno komponento bandymas atskirai gali būti sudėtingesnis, jei jis remiasi Singleton, nes Singleton būsena gali turėti įtakos testų rezultatams.
- Lygiagretumo problemos: Kelių gijų aplinkoje gali kilti problemų, susijusių su Singleton egzemplioriaus kūrimu ir inicijavimu. Jei kelios gijos vienu metu bandys sukurti „Singleton“, tai gali sukelti lenktynių sąlygas.
- Ribotas išplėtimas: Singleton modelis gali padaryti kodą mažiau išplečiamą. Jei vėliau nuspręsite, kad jums reikia kelių klasės egzempliorių arba norite pakeisti egzempliorių kūrimo logiką, gali prireikti reikšmingo pertvarkymo.
- Pasaulinė priklausomybė: Singleton modelis sukuria visuotinę priklausomybę, todėl sunkiau pakeisti Singleton alternatyviu diegimu arba naudoti priklausomybės injekciją egzemplioriams teikti.
- Sunku priskirti poklasį: Singleton subklasifikavimas gali būti sudėtingas. Kadangi konstruktorius paprastai yra privatus, Singleton pratęsimas reikalauja papildomos priežiūros ir gali nesilaikyti standartinių paveldėjimo modelių.
- Gyvenimo ciklo valdymas: „Singleton“ šablonas gali neatitikti scenarijų, kai egzempliorių reikia aiškiai sunaikinti arba nustatyti iš naujo. Singleton gyvavimo ciklo valdymas gali tapti rūpesčiu.
- Piktnaudžiavimas pasauliniu prieigos tašku: Nors visuotinis prieigos taškas yra pranašumas, juo taip pat galima piktnaudžiauti. Kūrėjai gali susigundyti naudoti „Singleton“ viskam, o tai lems pernelyg didelį globalios būsenos naudojimą ir mažiau modulinį dizainą.
10. Išvada
Kai kurioms klasėms svarbu turėti tiksliai vieną egzempliorių. Nors sistemoje gali būti daug spausdintuvų, turėtų būti tik vienas spausdintuvo rinkinys. Turėtų būti tik viena failų sistema ir viena langų tvarkyklė. Skaitmeninis filtras turės vieną A/D keitiklį. Apskaitos sistema bus skirta vienos įmonės aptarnavimui. Kaip užtikrinti, kad klasėje būtų tik vienas egzempliorius ir kad jis būtų lengvai pasiekiamas? Visuotinis kintamasis padaro objektą prieinamą, tačiau jis netrukdo sukurti kelių objektų.
Geresnis sprendimas yra nustatyti, kad pati klasė būtų atsakinga už savo vienintelio egzemplioriaus stebėjimą. Klasė gali užtikrinti, kad nebūtų sukurtas joks kitas egzempliorius (perimant prašymus sukurti naujus objektus), ir gali suteikti galimybę prieiti prie egzemplioriaus. Tai yra Singleton modelis.