logo

Singleton designmönster i Java

  1. Singleton designmönster i Java
  2. Fördelen med Singleton Pattern
  3. Användning av Singleton Pattern
  4. Exempel på Singleton Pattern

Singleton Pattern säger det bara 'definiera en klass som bara har en instans och ger en global åtkomstpunkt till den'.

Med andra ord måste en klass säkerställa att endast en instans ska skapas och att ett enda objekt kan användas av alla andra klasser.

Det finns två former av singleton designmönster

  • Tidig instansiering: skapande av instans vid laddningstid.
  • Lat instansiering: skapande av instans vid behov.

Fördel med Singleton designmönster

  • Sparar minne eftersom objekt inte skapas vid varje begäran. Endast en enda instans återanvänds om och om igen.

Användning av Singleton designmönster

  • Singleton-mönster används mest i flertrådiga och databasapplikationer. Den används i loggning, cachning, trådpooler, konfigurationsinställningar etc.

Uml av Singleton designmönster


Hur skapar man Singleton designmönster?

För att skapa singleton-klassen måste vi ha statisk medlem av klassen, privat konstruktör och statisk fabriksmetod.

  • Statisk medlem: Den får minne bara en gång på grund av statisk, den innehåller instansen av Singleton-klassen.
  • Privat konstruktör: Det kommer att förhindra att instansiera Singleton-klassen från utanför klassen.
  • Statisk fabriksmetod: Detta ger den globala åtkomstpunkten till Singleton-objektet och returnerar instansen till den som ringer.

Förstå tidig instansiering av Singleton Pattern

I sådana fall skapar vi instansen av klassen vid tidpunkten för att deklarera den statiska datamedlemmen, så instans av klassen skapas vid tidpunkten för klassladdning.

Låt oss se exemplet med singleton designmönster med tidig instansiering.

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

Förstå lat instansiering av Singleton Pattern

I sådana fall skapar vi instansen av klassen i synkroniserad metod eller synkroniserat block, så instans av klassen skapas vid behov.

Låt oss se det enkla exemplet på singeldesignmönster med lat instansiering.

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

Betydelsen av Classloader i Singleton Pattern

Om singleton-klassen laddas av två klassladdare skapas två instanser av singleton-klassen, en för varje klassladdare.


Betydelsen av serialisering i Singleton-mönster

Om singleton-klassen kan serialiseras kan du serialisera singleton-instansen. När det väl är serialiserat kan du deserialisera det men det returnerar inte singleton-objektet.

konvertera en int till en sträng java

För att lösa det här problemet måste du åsidosätta readResolve() metod som upprätthåller singeln. Det kallas precis efter att objektet har deserialiserats. Det returnerar singleton-objektet.

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

Förstå verkligt exempel på Singleton-mönster

  • Vi kommer att skapa en JDBCSingleton-klass. Denna JDBCSingleton-klass innehåller sin konstruktor som privat och en privat statisk instans jdbc av sig själv.
  • JDBCSingleton-klassen tillhandahåller en statisk metod för att få sin statiska instans till omvärlden. Nu kommer klassen JDBCSingletonDemo att använda klassen JDBCSingleton för att hämta JDBCSingleton-objektet.

Antagande: du har skapat en tabell användardata som har tre fält uid, uname och upassword i mysql-databasen. Databasnamnet är ashwinirajput, användarnamnet är root, lösenordet är ashwini.

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

ladda ner detta Singleton Pattern Exempel

Produktion