logo

Model de design singleton în Java

  1. Model de design singleton în Java
  2. Avantajul modelului Singleton
  3. Utilizarea modelului Singleton
  4. Exemplu de model Singleton

Singleton Pattern spune doar că „definiți o clasă care are o singură instanță și oferă un punct global de acces la aceasta”.

Cu alte cuvinte, o clasă trebuie să se asigure că trebuie creată o singură instanță și că un singur obiect poate fi folosit de toate celelalte clase.

Există două forme de model de design singleton

  • Instanciare timpurie: crearea instanței la momentul încărcării.
  • Instanțierea leneșă: crearea instanței atunci când este necesar.

Avantajul modelului de design Singleton

  • Salvează memorie deoarece obiectul nu este creat la fiecare solicitare. Doar o singură instanță este reutilizată din nou și din nou.

Utilizarea modelului de design Singleton

  • Modelul Singleton este folosit mai ales în aplicații cu mai multe fire și baze de date. Este folosit în înregistrare, stocare în cache, pool-uri de fire, setări de configurare etc.

Uml de model de design Singleton


Cum se creează un model de design Singleton?

Pentru a crea clasa singleton, trebuie să avem membru static al clasei, constructor privat și metoda fabricii statice.

  • Membru static: Primește memorie o singură dată din cauza statice, conține instanța clasei Singleton.
  • Constructor privat: Va împiedica instanțiarea clasei Singleton din afara clasei.
  • Metoda statică din fabrică: Aceasta oferă punctul global de acces la obiectul Singleton și returnează instanța apelantului.

Înțelegerea instanțierii timpurii a modelului Singleton

În acest caz, creăm instanța clasei în momentul declarării membrului de date static, astfel încât instanța clasei este creată în momentul încărcării clasei.

Să vedem exemplul modelului de design singleton folosind instanțierea timpurie.

Fișier: 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 } } 

Înțelegerea instanțierii leneșe a modelului Singleton

În acest caz, creăm instanța clasei în metoda sincronizată sau blocul sincronizat, astfel încât instanța clasei este creată atunci când este necesar.

Să vedem exemplul simplu de model de design singleton folosind instanțierea leneșă.

Fișier: 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 } } 

Semnificația Classloader în modelul Singleton

Dacă clasa singleton este încărcată de două classloader, vor fi create două instanțe ale clasei singleton, câte una pentru fiecare classloader.


Semnificația serializării în modelul Singleton

Dacă clasa singleton este Serializabil, puteți serializa instanța singleton. Odată ce este serializat, îl puteți deserializa, dar nu va returna obiectul singleton.

java arenext

Pentru a rezolva această problemă, trebuie să anulați metoda readResolve(). care impune singletonul. Este apelat imediat după ce obiectul este deserializat. Returnează obiectul singleton.

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

Înțelegerea unui exemplu real de model Singleton

  • Vom crea o clasă JDBCSingleton. Această clasă JDBCSingleton conține constructorul său ca privat și o instanță statică privată jdbc.
  • Clasa JDBCSingleton oferă o metodă statică pentru a trimite instanța sa statică în lumea exterioară. Acum, clasa JDBCSingletonDemo va folosi clasa JDBCSingleton pentru a obține obiectul JDBCSingleton.

Presupunere: ați creat un tabel userdata care are trei câmpuri uid, uname și upassword în baza de date mysql. Numele bazei de date este ashwinirajput, numele de utilizator este root, parola este ashwini.

Fișier: 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 
Fișier: 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); } } 

descărcați acest exemplu de model Singleton

Ieșire