logo

Singleton-ontwerppatroon in Java

  1. Singleton-ontwerppatroon in Java
  2. Voordeel van Singleton-patroon
  3. Gebruik van Singleton-patroon
  4. Voorbeeld van Singleton-patroon

Singleton Pattern zegt dat gewoon 'definieer een klasse die slechts één exemplaar heeft en daar een globaal toegangspunt voor biedt'.

Met andere woorden: een klasse moet ervoor zorgen dat er slechts één exemplaar wordt gemaakt en dat één object door alle andere klassen kan worden gebruikt.

Er zijn twee vormen van singleton-ontwerppatronen

  • Vroege instantiatie: creatie van een instance tijdens het laden.
  • Luie instantiatie: creatie van een exemplaar wanneer dat nodig is.

Voordeel van Singleton-ontwerppatroon

  • Bespaart geheugen omdat het object niet bij elk verzoek wordt gemaakt. Slechts één exemplaar wordt keer op keer hergebruikt.

Gebruik van Singleton-ontwerppatroon

  • Singleton-patroon wordt meestal gebruikt in multi-threaded- en databasetoepassingen. Het wordt gebruikt bij loggen, caching, threadpools, configuratie-instellingen enz.

Uml van Singleton-ontwerppatroon


Hoe maak je een Singleton-ontwerppatroon?

Om de singleton-klasse te maken, hebben we een statisch lid van de klasse, een privéconstructor en een statische fabrieksmethode nodig.

  • Statisch lid: Het krijgt slechts één keer geheugen vanwege statische elektriciteit. Het bevat de instantie van de klasse Singleton.
  • Particuliere bouwer: Het voorkomt dat de Singleton-klasse van buiten de klasse wordt geïnstantieerd.
  • Statische fabrieksmethode: Dit biedt het globale toegangspunt tot het Singleton-object en retourneert de instantie naar de aanroeper.

Inzicht in de vroege instantiatie van het Singleton-patroon

In dat geval maken we de instantie van de klasse op het moment dat het statische gegevenslid wordt gedeclareerd, zodat de instantie van de klasse wordt gemaakt op het moment dat de klasse wordt geladen.

Laten we het voorbeeld bekijken van een singleton-ontwerppatroon met behulp van vroege instantiatie.

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

Inzicht in luie instantiatie van Singleton-patroon

In dat geval creëren we de instantie van de klasse in de gesynchroniseerde methode of het gesynchroniseerde blok, zodat de instantie van de klasse wordt aangemaakt wanneer dat nodig is.

Laten we het eenvoudige voorbeeld bekijken van een singleton-ontwerppatroon met behulp van luie instantiatie.

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

Betekenis van Classloader in Singleton-patroon

Als de singleton-klasse door twee classloaders wordt geladen, worden er twee exemplaren van de singleton-klasse gemaakt, één voor elke classloader.


Betekenis van serialisatie in Singleton Pattern

Als de singleton-klasse Serialiseerbaar is, kunt u de singleton-instantie serialiseren. Zodra het is geserialiseerd, kunt u het deserialiseren, maar het singleton-object wordt niet geretourneerd.

Hoe kom ik erachter wat mijn monitorgrootte is?

Om dit probleem op te lossen, moet u de readResolve()-methode dat de singleton afdwingt. Het wordt aangeroepen net nadat het object is gedeserialiseerd. Het retourneert het singleton-object.

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

Een echt voorbeeld van het Singleton-patroon begrijpen

  • We gaan een JDBCSingleton-klasse maken. Deze klasse JDBCSingleton bevat zijn constructor als privé en een privé statische instantie jdbc van zichzelf.
  • De klasse JDBCSingleton biedt een statische methode om zijn statische instantie naar de buitenwereld te brengen. Nu zal de klasse JDBCSingletonDemo de klasse JDBCSingleton gebruiken om het JDBCSingleton-object op te halen.

Aanname: je hebt een tabel userdata gemaakt met drie velden uid, uname en upassword in de mysql-database. Databasenaam is ashwinirajput, gebruikersnaam is root, wachtwoord is ashwini.

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

download dit voorbeeld van Singleton-patroon

Uitvoer