logo

Singleton design mønster i Java

  1. Singleton design mønster i Java
  2. Fordel ved Singleton Pattern
  3. Brug af Singleton-mønster
  4. Eksempel på Singleton-mønster

Singleton Pattern siger det bare 'definer en klasse, der kun har én instans og giver et globalt adgangspunkt til den'.

Med andre ord skal en klasse sikre, at der kun skal oprettes en enkelt instans, og at et enkelt objekt kan bruges af alle andre klasser.

Der er to former for singleton-designmønster

  • Tidlig instansiering: oprettelse af instans ved indlæsningstid.
  • Doven instansering: oprettelse af instans, når det er nødvendigt.

Fordel ved Singleton designmønster

  • Sparer hukommelse, fordi objektet ikke oprettes ved hver anmodning. Kun en enkelt instans genbruges igen og igen.

Brug af Singleton designmønster

  • Singleton-mønster bruges mest i multi-threaded og databaseapplikationer. Det bruges til logning, caching, trådpuljer, konfigurationsindstillinger osv.

Uml of Singleton design mønster


Hvordan laver man Singleton designmønster?

For at skabe singleton-klassen skal vi have statisk medlem af klassen, privat konstruktør og statisk fabriksmetode.

  • Statisk medlem: Den får kun hukommelse én gang på grund af statisk, den indeholder forekomsten af ​​Singleton-klassen.
  • Privat konstruktør: Det vil forhindre at instantiere Singleton-klassen uden for klassen.
  • Statisk fabriksmetode: Dette giver det globale adgangspunkt til Singleton-objektet og returnerer forekomsten til den, der ringer.

Forståelse af tidlig instansiering af Singleton-mønster

I sådanne tilfælde opretter vi forekomsten af ​​klassen på det tidspunkt, hvor det statiske datamedlem erklæres, så forekomsten af ​​klassen oprettes på tidspunktet for indlæsning af klassen.

Lad os se eksemplet med singleton-designmønster ved hjælp af tidlig 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 } } 

Forstå doven instansiering af Singleton-mønster

I sådanne tilfælde opretter vi forekomsten af ​​klassen i synkroniseret metode eller synkroniseret blok, så forekomst af klassen oprettes, når det kræves.

Lad os se det enkle eksempel på singleton-designmønster ved hjælp af doven 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 } } 

Betydningen af ​​Classloader i Singleton-mønster

Hvis singleton-klassen indlæses af to klasseindlæsere, vil der blive oprettet to forekomster af singleton-klassen, en for hver klasseindlæser.


Betydningen af ​​serialisering i Singleton-mønster

Hvis singleton-klassen kan serialiseres, kan du serialisere singleton-forekomsten. Når det er serialiseret, kan du deserialisere det, men det vil ikke returnere singleton-objektet.

Spids vinkel

For at løse dette problem skal du tilsidesætte readResolve() metode der håndhæver singletonen. Det kaldes lige efter objektet er deserialiseret. Det returnerer singleton-objektet.

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

Forståelse af det rigtige eksempel på Singleton-mønster

  • Vi vil oprette en JDBCSingleton-klasse. Denne JDBCSingleton-klasse indeholder dens konstruktør som privat og en privat statisk instans jdbc af sig selv.
  • JDBCSingleton-klassen giver en statisk metode til at få sin statiske instans til omverdenen. Nu vil JDBCSingletonDemo-klassen bruge JDBCSingleton-klassen til at hente JDBCSingleton-objektet.

Antagelse: du har oprettet en tabel brugerdata, der har tre felter uid, uname og upassword i mysql database. Databasenavnet er ashwinirajput, brugernavnet er root, adgangskoden er 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); } } 

download dette Singleton Pattern Eksempel

Produktion