logo

Синглетон образац дизајна у Јави

  1. Синглетон образац дизајна у Јави
  2. Предности Синглетон Паттерна
  3. Употреба Синглетон Паттерна
  4. Пример једноструког узорка

Синглетон Паттерн каже да управо то 'дефинисати класу која има само једну инстанцу и која јој пружа глобалну тачку приступа'.

Другим речима, класа мора да обезбеди да се креира само једна инстанца и да један објекат могу да користе све друге класе.

Постоје два облика једноструког дизајна

  • Рана инстанција: креирање инстанце у време учитавања.
  • Лења инстанција: стварање инстанце када је потребно.

Предност дизајна Синглетон

  • Штеди меморију јер се објекат не креира на сваки захтев. Само једна инстанца се поново користи изнова и изнова.

Употреба обрасца дизајна Синглетон

  • Синглетон образац се углавном користи у апликацијама са више нити и базама података. Користи се за евидентирање, кеширање, скупове нити, подешавања конфигурације итд.

Умл обрасца дизајна Синглетон


Како креирати Синглетон образац дизајна?

Да бисмо креирали синглетон класу, потребно је да имамо статички члан класе, приватни конструктор и статички фабрички метод.

  • Статички члан: Добија меморију само једном због статичности, садржи инстанцу класе Синглетон.
  • Приватни конструктор: То ће спречити инстанцирање класе Синглетон изван класе.
  • Статичка фабричка метода: Ово обезбеђује глобалну тачку приступа објекту Синглетон и враћа инстанцу позиваоцу.

Разумевање раног инстанцирања једноструког узорка

У том случају, ми креирамо инстанцу класе у тренутку декларисања статичног члана података, тако да се инстанца класе креира у тренутку учитавања класе.

Хајде да видимо пример синглетон дизајн шаблона користећи рану инстанцију.

Фајл: А.јава
 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 } } 

Разумевање лење инстанцирања једноструког узорка

У том случају креирамо инстанцу класе у синхронизованој методи или синхронизованом блоку, тако да се инстанца класе креира када је то потребно.

Хајде да видимо једноставан пример синглетон дизајн шаблона користећи лењу инстанцију.

Фајл: А.јава
 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 } } 

Значај Цласслоадер-а у Синглетон Паттерну

Ако синглетон класу учитавају два учитавача класа, биће креиране две инстанце синглетон класе, по једна за сваки учитавач класа.


Значај серијализације у синглтон узорку

Ако је синглетон класа Сериализабле, можете серијализирати синглетон инстанцу. Када се серијализује, можете га десеријализирати, али неће вратити синглетон објекат.

интеллиј идеа вс ецлипсе

Да бисте решили овај проблем, морате да заобиђете реадРесолве() метода који намеће синглетон. Позива се одмах након што је објекат десеријализован. Враћа синглетон објекат.

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

Разумевање стварног примера једноструког узорка

  • Креираћемо ЈДБЦСинглетон класу. Ова класа ЈДБЦСинглетон садржи свој конструктор као приватну и приватну статичку инстанцу јдбц саме себе.
  • Класа ЈДБЦСинглетон пружа статичку методу да своју статичку инстанцу пренесе у спољашњи свет. Сада ће класа ЈДБЦСинглетонДемо користити класу ЈДБЦСинглетон да добије ЈДБЦСинглетон објекат.

Претпоставка: направили сте табелу корисничких података која има три поља уид, унаме и уппасворд у мискл бази података. Име базе података је асхвинирајпут, корисничко име је роот, лозинка је асхвини.

Датотека: ЈДБЦСинглетон.јава
 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 
Датотека: ЈДБЦСинглетонДемо.јава
 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); } } 

преузмите овај пример једног узорка

Излаз