logo

Modèle de conception Singleton en Java

  1. Modèle de conception Singleton en Java
  2. Avantage du modèle Singleton
  3. Utilisation du modèle Singleton
  4. Exemple de modèle Singleton

Singleton Pattern dit que 'définir une classe qui n'a qu'une seule instance et lui fournit un point d'accès global'.

En d’autres termes, une classe doit garantir qu’une seule instance doit être créée et qu’un seul objet peut être utilisé par toutes les autres classes.

Il existe deux formes de modèle de conception singleton

  • Instanciation précoce : création d'instance au moment du chargement.
  • Instanciation paresseuse : création d'instance lorsque cela est nécessaire.

Avantage du modèle de conception Singleton

  • Économise de la mémoire car l'objet n'est pas créé à chaque requête. Une seule instance est réutilisée encore et encore.

Utilisation du modèle de conception Singleton

  • Le modèle Singleton est principalement utilisé dans les applications multithread et de base de données. Il est utilisé dans la journalisation, la mise en cache, les pools de threads, les paramètres de configuration, etc.

Uml du modèle de conception Singleton


Comment créer un modèle de conception Singleton ?

Pour créer la classe singleton, nous devons avoir un membre statique de la classe, un constructeur privé et une méthode de fabrique statique.

  • Membre statique : Il n'obtient de la mémoire qu'une seule fois à cause de la statique, il contient l'instance de la classe Singleton.
  • Constructeur privé : Cela empêchera d’instancier la classe Singleton depuis l’extérieur de la classe.
  • Méthode d'usine statique : Cela fournit le point d'accès global à l'objet Singleton et renvoie l'instance à l'appelant.

Comprendre l'instanciation précoce du modèle Singleton

Dans ce cas, nous créons l'instance de la classe au moment de la déclaration des données membres statiques, donc l'instance de la classe est créée au moment du chargement de la classe.

Voyons l'exemple d'un modèle de conception singleton utilisant l'instanciation précoce.

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

Comprendre l'instanciation paresseuse du modèle Singleton

Dans ce cas, nous créons l'instance de la classe dans une méthode synchronisée ou un bloc synchronisé, donc l'instance de la classe est créée lorsque cela est nécessaire.

Voyons l'exemple simple d'un modèle de conception singleton utilisant l'instanciation paresseuse.

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

Importance du chargeur de classe dans le modèle Singleton

Si la classe singleton est chargée par deux chargeurs de classe, deux instances de classe singleton seront créées, une pour chaque chargeur de classe.


Importance de la sérialisation dans le modèle Singleton

Si la classe singleton est sérialisable, vous pouvez sérialiser l'instance singleton. Une fois sérialisé, vous pouvez le désérialiser mais il ne renverra pas l'objet singleton.

if else, instructions java

Pour résoudre ce problème, vous devez remplacer le Méthode readResolve() qui applique le singleton. Il est appelé juste après la désérialisation de l'objet. Il renvoie l'objet singleton.

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

Comprendre un exemple réel de modèle singleton

  • Nous allons créer une classe JDBCSingleton. Cette classe JDBCSingleton contient son constructeur en tant que privé et une instance statique privée jdbc d'elle-même.
  • La classe JDBCSingleton fournit une méthode statique pour transférer son instance statique vers le monde extérieur. Désormais, la classe JDBCSingletonDemo utilisera la classe JDBCSingleton pour obtenir l'objet JDBCSingleton.

Hypothèse: vous avez créé une table userdata contenant trois champs uid, uname et upassword dans la base de données MySQL. Le nom de la base de données est ashwinirajput, le nom d'utilisateur est root et le mot de passe est ashwini.

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

téléchargez cet exemple de modèle Singleton

Sortir