logo

Singleton-suunnittelukuvio Javassa

  1. Singleton-suunnittelukuvio Javassa
  2. Singleton Patternin etu
  3. Singleton Patternin käyttö
  4. Esimerkki Singleton-kuviosta

Singleton Pattern sanoo, että juuri 'määritä luokka, jolla on vain yksi esiintymä ja joka tarjoaa maailmanlaajuisen pääsypisteen siihen'.

Toisin sanoen luokan on varmistettava, että vain yksi ilmentymä luodaan ja että kaikki muut luokat voivat käyttää yhtä objektia.

Yksittäisiä suunnittelukuvioita on kaksi muotoa

  • Varhainen toteutus: ilmentymän luominen latausaikana.
  • Laiska ilmentymä: instanssin luominen tarvittaessa.

Singleton-suunnittelukuvion etu

  • Säästää muistia, koska objektia ei luoda jokaisella pyynnöstä. Vain yksittäistä esiintymää käytetään uudelleen ja uudelleen.

Singleton-suunnittelukuvion käyttö

  • Singleton-kuviota käytetään enimmäkseen monisäikeisissä ja tietokantasovelluksissa. Sitä käytetään kirjaamiseen, välimuistiin, säieryhmiin, kokoonpanoasetuksiin jne.

Uml Singleton-suunnittelukuviota


Kuinka luoda Singleton-suunnittelukuvio?

Singleton-luokan luomiseksi meillä on oltava staattinen luokan jäsen, yksityinen rakentaja ja staattinen tehdasmetodi.

  • Staattinen jäsen: Se saa muistia vain kerran staattisen sähkön vuoksi, se sisältää Singleton-luokan esiintymän.
  • Yksityinen rakentaja: Se estää Singleton-luokan ilmentämisen luokan ulkopuolelta.
  • Staattinen tehdasmenetelmä: Tämä tarjoaa maailmanlaajuisen yhteyspisteen Singleton-objektille ja palauttaa ilmentymän soittajalle.

Singleton Patternin varhaisen ilmentämisen ymmärtäminen

Tällaisessa tapauksessa luomme luokan ilmentymän staattisen datajäsenen ilmoittamisen yhteydessä, joten luokan ilmentymä luodaan luokan lataushetkellä.

Katsotaanpa esimerkkiä singleton-suunnittelukuviosta, jossa käytetään varhaista ilmentymistä.

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

Singleton Patternin laiskan ilmentämisen ymmärtäminen

Tällaisessa tapauksessa luomme luokan ilmentymän synkronoidulla menetelmällä tai synkronoidulla lohkolla, joten luokan ilmentymä luodaan tarvittaessa.

Katsotaanpa yksinkertainen esimerkki singleton suunnittelukuviosta, jossa käytetään laiskoja ilmentymiä.

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

Classloaderin merkitys Singleton Patternissa

Jos yksittäinen luokka ladataan kahdella luokanlataajalla, luodaan kaksi singleton-luokan esiintymää, yksi jokaiselle luokanlataajalle.


Sarjaamisen merkitys Singleton Patternissa

Jos singleton-luokka on Serialisoitava, voit sarjoittaa singleton-instanssin. Kun se on sarjoitettu, voit deserialisoida sen, mutta se ei palauta singleton-objektia.

maailman paras hymy

Tämän ongelman ratkaisemiseksi sinun on ohitettava readResolve() -menetelmä joka pakottaa singleton. Sitä kutsutaan heti objektin deserialisoinnin jälkeen. Se palauttaa singleton-objektin.

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

Todellinen esimerkki Singleton-kuviosta

  • Aiomme luoda JDBCSingleton-luokan. Tämä JDBCSingleton-luokka sisältää rakentajan yksityisenä ja yksityisen staattisen ilmentymän jdbc:n itsestään.
  • JDBCSingleton-luokka tarjoaa staattisen menetelmän saada sen staattinen ilmentymä ulkomaailmaan. Nyt JDBCSingletonDemo-luokka käyttää JDBCSingleton-luokkaa JDBCSingleton-objektin saamiseksi.

Oletus: olet luonut taulukon userdata, jossa on kolme kenttää uid, uname ja upassword mysql-tietokannassa. Tietokannan nimi on ashwinirajput, käyttäjätunnus on root, salasana on ashwini.

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

lataa tämä Singleton Pattern -esimerkki

Lähtö