- Návrhový vzor Singleton v Javě
- Výhoda vzoru Singleton
- Použití vzoru Singleton
- Příklad vzoru Singleton
Singleton Pattern říká, že právě 'definujte třídu, která má pouze jednu instanci a poskytuje k ní globální bod přístupu'.
Jinými slovy, třída musí zajistit, že by měla být vytvořena pouze jediná instance a jeden objekt mohl být použit všemi ostatními třídami.
Existují dvě formy designového vzoru singleton
- Včasná instanciace: vytvoření instance při načítání.
- Líná instance: vytvoření instance v případě potřeby.
Výhoda designového vzoru Singleton
- Šetří paměť, protože objekt se nevytváří při každém požadavku. Znovu a znovu se používá pouze jedna instance.
Použití návrhového vzoru Singleton
- Singleton vzor se většinou používá ve vícevláknových a databázových aplikacích. Používá se při protokolování, ukládání do mezipaměti, fondech vláken, nastavení konfigurace atd.
Uml návrhového vzoru Singleton
Jak vytvořit návrhový vzor Singleton?
K vytvoření singletonové třídy potřebujeme mít statický člen třídy, soukromý konstruktor a statickou tovární metodu.
- Statický člen: Paměť získává pouze jednou kvůli statice, obsahuje instanci třídy Singleton.
- Soukromý konstruktér: Zabrání vytvoření instance třídy Singleton z vnějšku třídy.
- Statická tovární metoda: To poskytuje globální bod přístupu k objektu Singleton a vrací instanci volajícímu.
Porozumění rané instanciaci vzoru Singleton
V takovém případě vytvoříme instanci třídy v době deklarace statického datového členu, takže instance třídy je vytvořena v době načítání třídy.
Podívejme se na příklad jednoduchého návrhového vzoru s použitím časné instance.
Soubor: A.javaclass A{ private static A obj=new A();//Early, instance will be created at load time private A(){} public static A getA(){ return obj; } public void doSomething(){ //write your code } }
Porozumění líné instanciaci vzoru Singleton
V takovém případě vytvoříme instanci třídy v synchronizované metodě nebo synchronizovaném bloku, takže instance třídy je vytvořena v případě potřeby.
Podívejme se na jednoduchý příklad jednoduchého návrhového vzoru využívajícího línou instanci.
Soubor: A.javaclass A{ private static A obj; private A(){} public static A getA(){ if (obj == null){ synchronized(Singleton.class){ if (obj == null){ obj = new Singleton();//instance will be created at request time } } } return obj; } public void doSomething(){ //write your code } }
Význam Classloaderu v Singleton Pattern
Pokud je třída singleton načtena dvěma classloadery, vytvoří se dvě instance třídy singleton, jedna pro každý classloader.
Význam serializace ve vzoru Singleton
Pokud je třída singleton serializovatelná, můžete instanci singleton serializovat. Jakmile je serializován, můžete jej deserializovat, ale nevrátí objekt typu singleton.
číslo 'euler' v jazyce Java'
Chcete-li tento problém vyřešit, musíte přepsat metoda readResolve(). která prosazuje singleton. Volá se těsně poté, co je objekt deserializován. Vrátí objekt typu singleton.
public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } }
Pochopení skutečného příkladu singletonového vzoru
- Vytvoříme třídu JDBCSingleton. Tato třída JDBCSingleton obsahuje svůj konstruktor jako soukromý a vlastní statickou instanci jdbc.
- Třída JDBCSingleton poskytuje statickou metodu, jak dostat svou statickou instanci do vnějšího světa. Nyní třída JDBCSingletonDemo použije třídu JDBCSingleton k získání objektu JDBCSingleton.
Předpoklad: vytvořili jste tabulku userdata, která má tři pole uid, uname a uppassword v databázi mysql. Název databáze je ashwinirajput, uživatelské jméno je root, heslo je ashwini.
Soubor: JDBCSingleton.javaimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; class JDBCSingleton { //Step 1 // create a JDBCSingleton class. //static member holds only one instance of the JDBCSingleton class. private static JDBCSingleton jdbc; //JDBCSingleton prevents the instantiation from any other class. private JDBCSingleton() { } //Now we are providing gloabal point of access. public static JDBCSingleton getInstance() { if (jdbc==null) { jdbc=new JDBCSingleton(); } return jdbc; } // to get the connection from methods like insert, view etc. private static Connection getConnection()throws ClassNotFoundException, SQLException { Connection con=null; Class.forName('com.mysql.jdbc.Driver'); con= DriverManager.getConnection('jdbc:mysql://localhost:3306/ashwanirajput', 'root', 'ashwani'); return con; } //to insert the record into the database public int insert(String name, String pass) throws SQLException { Connection c=null; PreparedStatement ps=null; int recordCounter=0; try { c=this.getConnection(); ps=c.prepareStatement('insert into userdata(uname,upassword)values(?,?)'); ps.setString(1, name); ps.setString(2, pass); recordCounter=ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally{ if (ps!=null){ ps.close(); }if(c!=null){ c.close(); } } return recordCounter; } //to view the data from the database public void view(String name) throws SQLException { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con=this.getConnection(); ps=con.prepareStatement('select * from userdata where uname=?'); ps.setString(1, name); rs=ps.executeQuery(); while (rs.next()) { System.out.println('Name= '+rs.getString(2)+' '+'Paasword= '+rs.getString(3)); } } catch (Exception e) { System.out.println(e);} finally{ if(rs!=null){ rs.close(); }if (ps!=null){ ps.close(); }if(con!=null){ con.close(); } } } // to update the password for the given username public int update(String name, String password) throws SQLException { Connection c=null; PreparedStatement ps=null; int recordCounter=0; try { c=this.getConnection(); ps=c.prepareStatement(' update userdata set upassword=? where uname=''+name+'' '); ps.setString(1, password); recordCounter=ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally{ if (ps!=null){ ps.close(); }if(c!=null){ c.close(); } } return recordCounter; } // to delete the data from the database public int delete(int userid) throws SQLException{ Connection c=null; PreparedStatement ps=null; int recordCounter=0; try { c=this.getConnection(); ps=c.prepareStatement(' delete from userdata where uid=''+userid+'' '); recordCounter=ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally{ if (ps!=null){ ps.close(); }if(c!=null){ c.close(); } } return recordCounter; } }// End of JDBCSingleton classSoubor: JDBCSingletonDemo.java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; class JDBCSingletonDemo{ static int count=1; static int choice; public static void main(String[] args) throws IOException { JDBCSingleton jdbc= JDBCSingleton.getInstance(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println('DATABASE OPERATIONS'); System.out.println(' --------------------- '); System.out.println(' 1. Insertion '); System.out.println(' 2. View '); System.out.println(' 3. Delete '); System.out.println(' 4. Update '); System.out.println(' 5. Exit '); System.out.print(' '); System.out.print('Please enter the choice what you want to perform in the database: '); choice=Integer.parseInt(br.readLine()); switch(choice) { case 1:{ System.out.print('Enter the username you want to insert data into the database: '); String username=br.readLine(); System.out.print('Enter the password you want to insert data into the database: '); String password=br.readLine(); try { int i= jdbc.insert(username, password); if (i>0) { System.out.println((count++) + ' Data has been inserted successfully'); }else{ System.out.println('Data has not been inserted '); } } catch (Exception e) { System.out.println(e); } System.out.println('Press Enter key to continue...'); System.in.read(); }//End of case 1 break; case 2:{ System.out.print('Enter the username : '); String username=br.readLine(); try { jdbc.view(username); } catch (Exception e) { System.out.println(e); } System.out.println('Press Enter key to continue...'); System.in.read(); }//End of case 2 break; case 3:{ System.out.print('Enter the userid, you want to delete: '); int userid=Integer.parseInt(br.readLine()); try { int i= jdbc.delete(userid); if (i>0) { System.out.println((count++) + ' Data has been deleted successfully'); }else{ System.out.println('Data has not been deleted'); } } catch (Exception e) { System.out.println(e); } System.out.println('Press Enter key to continue...'); System.in.read(); }//End of case 3 break; case 4:{ System.out.print('Enter the username, you want to update: '); String username=br.readLine(); System.out.print('Enter the new password '); String password=br.readLine(); try { int i= jdbc.update(username, password); if (i>0) { System.out.println((count++) + ' Data has been updated successfully'); } } catch (Exception e) { System.out.println(e); } System.out.println('Press Enter key to continue...'); System.in.read(); }// end of case 4 break; default: return; } } while (choice!=4); } }
stáhněte si tento příklad vzoru Singleton