V objektově orientovaném programování je třída java singleton třída, která může mít současně pouze jeden objekt (instanci třídy). Když se poprvé pokusíme vytvořit instanci tříd Java Singleton, nová proměnná také ukazuje na první vytvořenou instanci. Takže jakékoli úpravy, které provedeme v jakékoli proměnné uvnitř třídy prostřednictvím jakékoli instance, ovlivní proměnnou vytvořené jediné instance a je viditelná, pokud k této proměnné přistupujeme prostřednictvím jakékoli proměnné daného typu definované třídy.
Pamatujte na klíčové body při definování třídy jako singletonové třídy, což je při navrhování singletonové třídy:
- Udělejte konstruktor soukromým.
- Napište statickou metodu, která má objekt návratového typu této třídy singleton. Zde se k zápisu této statické metody používá koncept Lazy inicializace.
Účel třídy Singleton
Primárním účelem třídy Java Singleton je omezit limit počtu vytvořených objektů pouze na jeden. To často zajišťuje, že existuje řízení přístupu ke zdrojům, například připojení k soketu nebo databázi.
Při použití třídy singleton nedochází k plýtvání paměťovým prostorem, protože omezuje vytváření instancí. Protože k vytvoření objektu dojde pouze jednou, místo toho, aby se vytvářel při každém novém požadavku.
Tento jediný objekt můžeme použít opakovaně dle požadavků. To je důvod, proč vícevláknové a databázové aplikace většinou využívají vzor Singleton v Javě pro ukládání do mezipaměti, protokolování, sdružování vláken, nastavení konfigurace a mnoho dalšího.
Například máme licenci a máme pouze jedno připojení k databázi nebo předpokládejme, že náš ovladač JDBC nám neumožňuje provádět multithreading, pak přichází na řadu třída Singleton a zajišťuje, že v jeden okamžik bude k dispozici pouze jediné připojení. nebo jedno vlákno může přistupovat k připojení.
Jak navrhnout/vytvořit třídu Singleton v Javě?
Chcete-li vytvořit třídu singleton, musíme postupovat podle kroků uvedených níže:
1. Ujistěte se, že existuje pouze jedna instance třídy.
2. Poskytněte globální přístup k této instanci pomocí
- Prohlášení všech konstruktorů třídy za soukromé.
- Poskytování statické metody, která vrací odkaz na instanci. K zápisu statických metod se používá koncept líné inicializace.
- Instance je uložena jako soukromá statická proměnná.
Příkladem singletonových tříd je Třída běhu, servlet akcí a lokátor služeb . Soukromé konstruktory a tovární metody jsou také příkladem třídy singleton.
Rozdíl mezi třídou Normal a třídou Singleton
Třídu Singleton můžeme odlišit od běžných tříd s ohledem na proces vytváření instance objektu třídy. K vytvoření instance normální třídy používáme konstruktor Java. Na druhou stranu, k vytvoření instance singletonové třídy používáme metodu getInstance().
Dalším rozdílem je, že normální třída zmizí na konci životního cyklu aplikace, zatímco třída singleton se nezničí dokončením aplikace.
Formy vzoru třídy Singleton
Existují dvě formy designových vzorů singleton, které jsou:
- Včasná instanciace: Vytváření objektu probíhá při načítání.
- Líná instance: Vytvoření objektu se provádí podle požadavku.
Implementace: Podívejme se krátce, jak se třída singleton liší od normální třídy v jazyce Java. Zde je rozdíl z hlediska konkretizace, protože pro normální třídu používáme konstruktor, zatímco pro třídu singleton používáme metoda getInstance(). které budeme vyhlížet v příkladu 1, jak je znázorněno níže. Obecně, abychom se vyhnuli nejasnostem, můžeme při definování této metody použít jako název metody také název třídy, který bude znázorněn v příkladu 2 níže.
Příklad 1:
Jáva
// 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ýstup
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>
Vysvětlení výstupu:
Ve třídě singleton, když poprvé zavoláme metoda getInstance(). , vytvoří objekt třídy s názvem single_instance a vrátí jej do proměnné. Protože single_instance je statická, změní se z null na nějaký objekt. Pokud se příště pokusíme zavolat metodu getInstance(), protože single_instance není null, vrátí se do proměnné, místo aby znovu vytvořila instanci třídy Singleton. Tato část se provádí pomocí podmínky if.
V hlavní třídě vytvoříme instanci singletonové třídy se 3 objekty x, y a z voláním static metoda getInstance() . Ale ve skutečnosti po vytvoření objektu x jsou proměnné yaz nasměrovány na objekt x, jak je znázorněno na diagramu. Pokud tedy změníme proměnné objektu x, projeví se to při přístupu k proměnným objektů y a z. Také pokud změníme proměnné objektu z, projeví se to při přístupu k proměnným objektů x a y.
Nyní jsme hotovi s pokrytím všech aspektů příkladu 1 a implementovali jsme totéž, nyní budeme implementovat třídu Singleton s názvem metody jako názvem třídy.
string.format java
Příklad 2:
Jáva
// 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);> > }> }> |
>
>Výstup
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>
Vysvětlení: Když ve třídě singleton poprvé zavoláme metodu Singleton(), vytvoří objekt třídy Singleton s názvem single_instance a vrátí jej do proměnné. Protože single_instance je statická, změní se z null na nějaký objekt. Když se příště pokusíme zavolat metodu Singleton(), protože single_instance není null, vrátí se do proměnné, místo aby znovu vytvořila instanci třídy Singleton.
Čtěte dále: Výukový program návrhových vzorů Java