- Singleton designmønster i Java
- Fordel med Singleton Pattern
- Bruk av Singleton Pattern
- Eksempel på Singleton Pattern
Singleton Pattern sier det bare 'definer en klasse som bare har én forekomst og gir et globalt tilgangspunkt til den'.
Med andre ord, en klasse må sørge for at bare enkeltforekomster skal opprettes og enkeltobjekt kan brukes av alle andre klasser.
Det er to former for singleton-designmønster
- Tidlig instansiering: opprettelse av instans ved lastetid.
- Lat instansiering: opprettelse av instans når det er nødvendig.
Fordel med Singleton designmønster
- Sparer minne fordi objektet ikke opprettes ved hver forespørsel. Bare enkeltforekomster gjenbrukes igjen og igjen.
Bruk av Singleton designmønster
- Singleton-mønster brukes mest i multi-threaded og databaseapplikasjoner. Den brukes i logging, caching, trådpooler, konfigurasjonsinnstillinger etc.
Uml of Singleton designmønster
Hvordan lage Singleton designmønster?
For å lage singleton-klassen må vi ha statisk medlem av klassen, privat konstruktør og statisk fabrikkmetode.
- Statisk medlem: Den får minne bare én gang på grunn av statisk, den inneholder forekomsten av Singleton-klassen.
- Privat konstruktør: Det vil forhindre å instansiere Singleton-klassen fra utenfor klassen.
- Statisk fabrikkmetode: Dette gir det globale tilgangspunktet til Singleton-objektet og returnerer forekomsten til den som ringer.
Forstå tidlig instansiering av Singleton Pattern
I slike tilfeller oppretter vi forekomsten av klassen på tidspunktet for deklarering av det statiske datamedlemmet, så forekomsten av klassen opprettes på tidspunktet for klasseinnlasting.
La oss se eksemplet med singleton-designmønster ved å bruke tidlig instansiering.
Fil: A.javaclass 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å lat instansiering av Singleton Pattern
I slike tilfeller oppretter vi forekomsten av klassen i synkronisert metode eller synkronisert blokk, så forekomst av klassen opprettes når det er nødvendig.
La oss se det enkle eksemplet på singleton-designmønster ved bruk av lat instansiering.
Fil: A.javaclass 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 av Classloader i Singleton Pattern
Hvis singleton-klassen lastes av to klasselastere, vil to forekomster av singleton-klassen bli opprettet, en for hver klasselaster.
Betydningen av serialisering i Singleton-mønster
Hvis singleton-klassen er serialiserbar, kan du serialisere singleton-forekomsten. Når det er serialisert, kan du deserialisere det, men det vil ikke returnere singleton-objektet.
round robin planleggingsalgoritme
For å løse dette problemet må du overstyre readResolve()-metoden som håndhever singletonen. Det kalles like etter at objektet er deserialisert. Den returnerer singleton-objektet.
public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } }
Forstå ekte eksempel på singleton-mønster
- Vi skal lage en JDBCSingleton-klasse. Denne JDBCSingleton-klassen inneholder konstruktøren som privat og en privat statisk forekomst jdbc av seg selv.
- JDBCSingleton-klassen gir en statisk metode for å få sin statiske instans til omverdenen. Nå vil JDBCSingletonDemo-klassen bruke JDBCSingleton-klassen for å hente JDBCSingleton-objektet.
Antagelse: du har laget en tabell brukerdata som har tre felt uid, uname og upassword i mysql-databasen. Databasenavnet er ashwinirajput, brukernavnet er root, passordet er ashwini.
Fil: JDBCSingleton.javaimport 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 classFil: 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); } }
last ned dette Singleton Pattern Eksempel