logo

Dizajnový vzor Singleton v jazyku Java

  1. Dizajnový vzor Singleton v jazyku Java
  2. Výhoda vzoru Singleton
  3. Použitie vzoru Singleton
  4. Príklad vzoru Singleton

Singleton Pattern hovorí, že práve 'definovať triedu, ktorá má iba jednu inštanciu a poskytuje k nej globálny prístupový bod'.

Inými slovami, trieda musí zabezpečiť, že by mala byť vytvorená iba jedna inštancia a že jeden objekt môžu používať všetky ostatné triedy.

Existujú dve formy dizajnového vzoru singleton

  • Včasná inštancia: vytvorenie inštancie v čase načítania.
  • Lenivá inštancia: vytvorenie inštancie v prípade potreby.

Výhoda dizajnového vzoru Singleton

  • Šetrí pamäť, pretože objekt sa nevytvára pri každej požiadavke. Iba jedna inštancia sa znova a znova používa.

Použitie vzoru Singleton

  • Singleton vzor sa väčšinou používa vo viacvláknových a databázových aplikáciách. Používa sa pri protokolovaní, ukladaní do vyrovnávacej pamäte, fondoch vlákien, konfiguračných nastaveniach atď.

Uml dizajnového vzoru Singleton


Ako vytvoriť dizajnový vzor Singleton?

Aby sme vytvorili triedu singleton, potrebujeme mať statický člen triedy, súkromný konštruktor a metódu statickej továrne.

  • Statický člen: Pamäť získa iba raz kvôli statike, obsahuje inštanciu triedy Singleton.
  • Súkromný konštruktér: Zabráni inštancii triedy Singleton mimo triedy.
  • Statická výrobná metóda: Toto poskytuje globálny prístupový bod k objektu Singleton a vracia inštanciu volajúcemu.

Pochopenie skorej instanciácie vzoru Singleton

V takom prípade vytvoríme inštanciu triedy v čase deklarovania statického dátového člena, takže inštancia triedy sa vytvorí v čase načítania triedy.

Pozrime sa na príklad singletonového návrhového vzoru s použitím skorej inštancie.

Súbor: A.java
 class 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 } } 

Pochopenie lenivého vytvárania vzoru Singleton

V takom prípade vytvoríme inštanciu triedy v synchronizovanej metóde alebo synchronizovanom bloku, takže inštancia triedy sa vytvorí v prípade potreby.

Pozrime sa na jednoduchý príklad jednoduchého vzoru návrhu pomocou lenivej inštancie.

Súbor: A.java
 class 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 Classloader v Singleton Pattern

Ak je trieda singleton načítaná dvoma classloadermi, vytvoria sa dve inštancie singleton class, jedna pre každý classloader.


Význam serializácie v Singletonovom vzore

Ak je trieda singleton serializovateľná, inštanciu singleton môžete serializovať. Akonáhle je serializovaný, môžete ho deserializovať, ale nevráti jediný objekt.

rozbaľovacia ponuka javascript

Ak chcete vyriešiť tento problém, musíte prepísať metóda readResolve(). ktorá presadzuje singleton. Volá sa hneď po deserializácii objektu. Vracia objekt typu singleton.

 public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } } 

Pochopenie skutočného príkladu vzoru Singleton

  • Vytvoríme triedu JDBCSingleton. Táto trieda JDBCSingleton obsahuje svoj konštruktor ako súkromnú a vlastnú statickú inštanciu jdbc.
  • Trieda JDBCSingleton poskytuje statickú metódu, ako dostať svoju statickú inštanciu do vonkajšieho sveta. Teraz trieda JDBCSingletonDemo použije triedu JDBCSingleton na získanie objektu JDBCSingleton.

Predpoklad: vytvorili ste tabuľku užívateľské údaje, ktorá má tri polia uid, uname a upassword v databáze mysql. Názov databázy je ashwinirajput, používateľské meno je root, heslo je ashwini.

Súbor: JDBCSingleton.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 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 class 
Súbor: 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); } } 

stiahnite si tento príklad vzoru Singleton

Výkon