- Singleton дизайн модел в Java
- Предимство на Singleton Pattern
- Използване на Singleton Pattern
- Пример за единичен модел
Singleton Pattern казва това просто 'дефинирайте клас, който има само един екземпляр и предоставя глобална точка за достъп до него'.
С други думи, класът трябва да гарантира, че трябва да бъде създаден само един екземпляр и един обект може да се използва от всички други класове.
Има две форми на единичен модел на проектиране
- Ранно инстанциране: създаване на екземпляр по време на зареждане.
- Мързелива инстанция: създаване на екземпляр, когато е необходимо.
Предимство на шаблона за дизайн на Singleton
- Спестява памет, защото обектът не се създава при всяка заявка. Само един екземпляр се използва отново и отново.
Използване на модел на дизайн Singleton
- Singleton моделът се използва най-вече в многонишкови приложения и приложения за бази данни. Използва се при регистриране, кеширане, пулове от нишки, конфигурационни настройки и др.
Uml на шаблон за проектиране на Singleton
Как да създадете шаблон за дизайн на Singleton?
За да създадем единичен клас, трябва да имаме статичен член на класа, частен конструктор и статичен фабричен метод.
- Статичен член: Получава памет само веднъж поради статика, съдържа екземпляра на класа Singleton.
- Частен конструктор: Това ще предотврати инстанцирането на класа Singleton извън класа.
- Статичен фабричен метод: Това осигурява глобалната точка за достъп до обекта Singleton и връща екземпляра на повикващия.
Разбиране на ранното създаване на единичен модел
В такъв случай ние създаваме екземпляра на класа по време на деклариране на статичния член на данните, така че екземплярът на класа се създава по време на зареждането на класа.
Нека видим примера на единичен модел на проектиране, използващ ранно инстанциране.
Файл: 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 } }
Разбиране на мързеливо инстанциране на единичен модел
В такъв случай ние създаваме екземпляра на класа в синхронизиран метод или синхронизиран блок, така че екземплярът на класа се създава, когато е необходимо.
Нека видим простия пример за модел на проектиране на единичен елемент, използващ мързеливо инстанциране.
Файл: 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 } }
Значение на Classloader в Singleton Pattern
Ако единичният клас се зарежда от два зареждащи класа, ще бъдат създадени два екземпляра на единичен клас, по един за всеки зареждащ клас.
Значение на сериализацията в Singleton Pattern
Ако класът singleton е Serializable, можете да сериализирате екземпляра singleton. След като бъде сериализиран, можете да го десериализирате, но той няма да върне единичния обект.
запазете видео в youtube vlc
За да разрешите този проблем, трябва да замените readResolve() метод който налага сингълтона. Извиква се точно след като обектът е десериализиран. Връща единичния обект.
public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } }
Разбиране на реален пример за единичен модел
- Ще създадем JDBCSingleton клас. Този клас JDBCSingleton съдържа своя конструктор като частен и частен статичен екземпляр jdbc за себе си.
- Класът JDBCSingleton предоставя статичен метод за предаване на неговия статичен екземпляр на външния свят. Сега класът JDBCSingletonDemo ще използва клас JDBCSingleton, за да получи обекта JDBCSingleton.
Предположение: сте създали таблица userdata, която има три полета uid, uname и upassword в базата данни mysql. Името на базата данни е ashwinirajput, потребителското име е root, паролата е ashwini.
Файл: 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 classФайл: 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); } }
изтеглете този пример за единичен модел