logo

Modello di progettazione singleton in Java

  1. Modello di progettazione singleton in Java
  2. Vantaggio del modello Singleton
  3. Utilizzo del modello Singleton
  4. Esempio di modello Singleton

Singleton Pattern lo dice proprio 'definisce una classe che ha una sola istanza e fornisce un punto di accesso globale ad essa'.

In altre parole, una classe deve garantire che venga creata solo una singola istanza e che un singolo oggetto possa essere utilizzato da tutte le altre classi.

Esistono due forme di modello di progettazione singleton

  • Istanziazione anticipata: creazione dell'istanza al momento del caricamento.
  • Istanziazione pigra: creazione dell'istanza quando richiesto.

Vantaggio del modello di progettazione Singleton

  • Risparmia memoria perché l'oggetto non viene creato ad ogni richiesta. Solo una singola istanza viene riutilizzata più e più volte.

Utilizzo del modello di progettazione Singleton

  • Il modello Singleton viene utilizzato principalmente nelle applicazioni multi-thread e di database. Viene utilizzato nella registrazione, nella memorizzazione nella cache, nei pool di thread, nelle impostazioni di configurazione, ecc.

Uml del modello di progettazione Singleton


Come creare il modello di progettazione Singleton?

Per creare la classe singleton, dobbiamo avere un membro statico della classe, un costruttore privato e un metodo factory statico.

  • Membro statico: Ottiene memoria solo una volta a causa dell'elettricità statica, contiene l'istanza della classe Singleton.
  • Costruttore privato: Impedisce di creare un'istanza della classe Singleton dall'esterno della classe.
  • Metodo della fabbrica statica: Ciò fornisce il punto di accesso globale all'oggetto Singleton e restituisce l'istanza al chiamante.

Comprendere l'istanziazione iniziale del modello Singleton

In tal caso, creiamo l'istanza della classe al momento della dichiarazione del membro dati statico, quindi l'istanza della classe viene creata al momento del caricamento della classe.

Vediamo l'esempio del modello di progettazione singleton utilizzando l'istanziazione anticipata.

File: 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 } } 

Comprensione dell'istanziazione pigra del modello Singleton

In tal caso, creiamo l'istanza della classe nel metodo sincronizzato o nel blocco sincronizzato, quindi l'istanza della classe viene creata quando richiesto.

Vediamo il semplice esempio di modello di progettazione singleton che utilizza l'istanziazione pigra.

File: 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 } } 

Significato del Classloader nel modello Singleton

Se la classe singleton viene caricata da due classloader, verranno create due istanze della classe singleton, una per ciascun classloader.


Significato della serializzazione nel modello Singleton

Se la classe singleton è Serializable, puoi serializzare l'istanza singleton. Una volta serializzato, puoi deserializzarlo ma non restituirà l'oggetto singleton.

java hasuccessivo

Per risolvere questo problema, è necessario sovrascrivere il file metodo readResolve() che impone il singleton. Viene chiamato subito dopo la deserializzazione dell'oggetto. Restituisce l'oggetto singleton.

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

Comprensione dell'esempio reale del modello Singleton

  • Creeremo una classe JDBCSingleton. Questa classe JDBCSingleton contiene il proprio costruttore come privato e un'istanza statica privata jdbc di se stessa.
  • La classe JDBCSingleton fornisce un metodo statico per portare la sua istanza statica nel mondo esterno. Ora, la classe JDBCSingletonDemo utilizzerà la classe JDBCSingleton per ottenere l'oggetto JDBCSingleton.

Assunzione: hai creato una tabella userdata che ha tre campi uid, uname e uppassword nel database mysql. Il nome del database è ashwinirajput, il nome utente è root, la password è ashwini.

File: 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 
File: 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); } } 

scarica questo esempio di modello Singleton

Produzione