V objektovo orientovanom programovaní je trieda java singleton trieda, ktorá môže mať naraz iba jeden objekt (inštanciu triedy). Ak sa po prvýkrát pokúsime vytvoriť inštanciu tried Java Singleton, nová premenná tiež ukazuje na prvú vytvorenú inštanciu. Takže akékoľvek úpravy, ktoré vykonáme v akejkoľvek premennej v triede prostredníctvom akejkoľvek inštancie, ovplyvnia premennú vytvorenej jedinej inštancie a je viditeľná, ak k tejto premennej pristupujeme prostredníctvom akejkoľvek definovanej premennej daného typu triedy.
Pamätajte na kľúčové body pri definovaní triedy ako singletonovej triedy, ktorá je pri navrhovaní singletonovej triedy:
- Nastavte konštruktor ako súkromný.
- Napíšte statickú metódu, ktorá má objekt návratového typu tejto singletonovej triedy. Tu sa na napísanie tejto statickej metódy používa koncept Lazy inicializácie.
Účel triedy Singleton
Primárnym účelom triedy Java Singleton je obmedziť limit počtu vytvorených objektov iba na jeden. To často zaisťuje, že existuje kontrola prístupu k zdrojom, napríklad k soketu alebo pripojeniu k databáze.
Pri použití triedy singleton nedochádza k plytvaniu pamäťovým priestorom, pretože obmedzuje vytváranie inštancií. Keďže vytvorenie objektu prebehne iba raz, namiesto toho, aby sa vytváral pri každej novej požiadavke.
Tento jediný objekt môžeme použiť opakovane podľa požiadaviek. To je dôvod, prečo viacvláknové a databázové aplikácie väčšinou využívajú vzor Singleton v Jave na ukladanie do vyrovnávacej pamäte, protokolovanie, združovanie vlákien, konfiguračné nastavenia a oveľa viac.
Napríklad, máme licenciu a máme iba jedno pripojenie k databáze alebo predpokladajme, že náš ovládač JDBC nám neumožňuje vykonávať viacvláknové spracovanie, potom prichádza do úvahy trieda Singleton a zaisťuje, že v danom čase bude k dispozícii iba jedno pripojenie. alebo jedno vlákno môže pristupovať k pripojeniu.
Ako navrhnúť/vytvoriť triedu Singleton v jazyku Java?
Ak chcete vytvoriť triedu singleton, musíme postupovať podľa krokov uvedených nižšie:
1. Uistite sa, že existuje iba jedna inštancia triedy.
java arraylist
2. Poskytnite globálny prístup k tejto inštancii prostredníctvom
- Vyhlásenie všetkých konštruktérov triedy za súkromné.
- Poskytnutie statickej metódy, ktorá vráti odkaz na inštanciu. Na písanie statických metód sa používa koncept lenivej inicializácie.
- Inštancia je uložená ako súkromná statická premenná.
Príkladom singletonových tried je Runtime trieda, Action Servlet a Service Locator . Súkromné konštruktory a továrenské metódy sú tiež príkladom triedy singleton.
Rozdiel medzi normálnou triedou a triedou Singleton
Singletonovu triedu môžeme odlíšiť od bežných tried s ohľadom na proces vytvárania inštancií objektu triedy. Na vytvorenie inštancie normálnej triedy používame java konštruktor. Na druhej strane, na vytvorenie inštancie singletonovej triedy používame metódu getInstance().
Ďalším rozdielom je, že normálna trieda zmizne na konci životného cyklu aplikácie, zatiaľ čo trieda singleton sa nezničí dokončením aplikácie.
Formy vzoru triedy Singleton
Existujú dve formy jednofarebných dizajnových vzorov, ktoré sú:
- Včasná inštancia: Vytváranie objektu prebieha v čase načítania.
- Lenivá inštancia: Vytvorenie objektu sa vykonáva podľa požiadavky.
Implementácia: Poďme stručne, ako sa trieda singleton líši od normálnej triedy v jazyku Java. Tu je rozdiel z hľadiska inštancie, pretože pre normálnu triedu používame konštruktor, zatiaľ čo pre triedu singleton používame metóda getInstance(). ktoré budeme vykúkať v príklade 1, ako je znázornené nižšie. Vo všeobecnosti, aby sme sa vyhli nejasnostiam, môžeme pri definovaní tejto metódy použiť aj názov triedy ako názov metódy, ktorý bude znázornený v príklade 2 nižšie.
Príklad 1:
Java
// Java program implementing Singleton class> // with using getInstance() method> // Class 1> // Helper class> class> Singleton {> >// Static variable reference of single_instance> >// of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor> >// Here we will be creating private constructor> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Static method> >// Static method to create instance of Singleton class> >public> static> synchronized> Singleton getInstance()> >{> >if> (single_instance ==>null>)> >single_instance =>new> Singleton();> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.getInstance();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.getInstance();> >// Instantiating Singleton class with variable z> >Singleton z = Singleton.getInstance();> >// Printing the hash code for above variable as> >// declared> >System.out.println(>'Hashcode of x is '> >+ x.hashCode());> >System.out.println(>'Hashcode of y is '> >+ y.hashCode());> >System.out.println(>'Hashcode of z is '> >+ z.hashCode());> >// Condition check> >if> (x == y && y == z) {> >// Print statement> >System.out.println(> >'Three objects point to the same memory location on the heap i.e, to the same object'>);> >}> >else> {> >// Print statement> >System.out.println(> >'Three objects DO NOT point to the same memory location on the heap'>);> >}> >}> }> |
>
>Výkon
Hashcode of x is 558638686 Hashcode of y is 558638686 Hashcode of z is 558638686 Three objects point to the same memory location on the heap i.e, to the same object>
Vysvetlenie výstupu:

neriadený prechod cez strom
V triede singleton, keď prvýkrát voláme metóda getInstance(). , vytvorí objekt triedy s názvom single_instance a vráti ho do premennej. Keďže single_instance je statická, zmení sa z null na nejaký objekt. Ak sa nabudúce pokúsime zavolať metódu getInstance(), keďže single_instance nie je null, vráti sa do premennej namiesto opätovného vytvorenia inštancie triedy Singleton. Táto časť sa vykonáva pomocou podmienky if.
V hlavnej triede vytvoríme inštanciu singletonovej triedy s 3 objektmi x, y a z volaním statického metóda getInstance() . Ale v skutočnosti po vytvorení objektu x sú premenné y a z nasmerované na objekt x, ako je znázornené na diagrame. Ak teda zmeníme premenné objektu x, prejaví sa to pri prístupe k premenným objektov y a z. Taktiež ak zmeníme premenné objektu z, prejaví sa to pri prístupe k premenným objektov x a y.
Teraz sme skončili s pokrytím všetkých aspektov príkladu 1 a implementovali sme to isté, teraz budeme implementovať triedu Singleton s názvom metódy ako názvom triedy.
Príklad 2:
Java
// Java program implementing Singleton class> // with method name as that of class> // Class 1> // Helper class> class> Singleton {> >// Static variable single_instance of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor of this class> >// Here private constructor is used to> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Method> >// Static method to create instance of Singleton class> >public> static> Singleton Singleton()> >{> >// To ensure only one instance is created> >if> (single_instance ==>null>) {> >single_instance =>new> Singleton();> >}> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.Singleton();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.Singleton();> >// instantiating Singleton class with variable z> >Singleton z = Singleton.Singleton();> >// Now changing variable of instance x> >// via toUpperCase() method> >x.s = (x.s).toUpperCase();> >// Print and display commands> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >System.out.println(>'
'>);> >// Now again changing variable of instance z> >z.s = (z.s).toLowerCase();> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >}> }> |
>
parafrázovať ako rudyard kipling
>Výkon
String from x is HELLO I AM A STRING PART OF SINGLETON CLASS String from y is HELLO I AM A STRING PART OF SINGLETON CLASS String from z is HELLO I AM A STRING PART OF SINGLETON CLASS String from x is hello i am a string part of singleton class String from y is hello i am a string part of singleton class String from z is hello i am a string part of singleton class>
Vysvetlenie: V triede singleton, keď prvýkrát zavoláme metódu Singleton(), vytvorí objekt triedy Singleton s názvom single_instance a vráti ho do premennej. Keďže single_instance je statická, zmení sa z null na nejaký objekt. Ak sa nabudúce pokúsime zavolať metódu Singleton(), keďže single_instance nie je null, vráti sa do premennej namiesto opätovného vytvárania inštancie triedy Singleton.
Čítajte ďalej: Výukový program návrhových vzorov Java