logo

Шаблон проектування Singleton в Java

  1. Шаблон проектування Singleton в Java
  2. Перевага Singleton Pattern
  3. Використання шаблону Singleton
  4. Приклад шаблону Singleton

Шаблон Сінглтона говорить, що просто 'визначте клас, який має лише один екземпляр і забезпечує глобальну точку доступу до нього'.

Іншими словами, клас повинен гарантувати, що буде створено лише один екземпляр, а один об’єкт може використовуватися всіма іншими класами.

Є дві форми однотонного шаблону проектування

  • Рання інстанція: створення екземпляра під час завантаження.
  • Ледачий екземпляр: створення екземпляра за потреби.

Перевага шаблону проектування Singleton

  • Економить пам'ять, оскільки об'єкт не створюється за кожним запитом. Тільки один екземпляр використовується знову і знову.

Використання шаблону проектування Singleton

  • Шаблон Singleton здебільшого використовується в багатопоточних програмах і програмах баз даних. Він використовується для журналювання, кешування, пулів потоків, параметрів конфігурації тощо.

Uml шаблону проектування Singleton


Як створити шаблон дизайну Singleton?

Щоб створити одиночний клас, нам потрібно мати статичний член класу, приватний конструктор і статичний фабричний метод.

  • Статичний член: Він отримує пам'ять лише один раз через статику, він містить екземпляр класу Singleton.
  • Приватний забудовник: Це запобігатиме створенню екземпляра класу Singleton поза класом.
  • Статичний заводський метод: Це забезпечує глобальну точку доступу до об’єкта Singleton і повертає примірник абоненту.

Розуміння ранньої інстанції шаблону Singleton

У такому випадку ми створюємо екземпляр класу під час оголошення статичного члена даних, тому екземпляр класу створюється під час завантаження класу.

Давайте розглянемо приклад шаблону проектування одного елемента з використанням раннього екземпляра.

Файл: 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

У такому випадку ми створюємо екземпляр класу в синхронізованому методі або синхронізованому блоці, тому екземпляр класу створюється за потреби.

Давайте подивимося на простий приклад єдиного шаблону проектування з використанням відкладеної інстанції.

Файл: 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 } } 

Значення завантажувача класів у шаблоні Singleton

Якщо клас singleton завантажується двома завантажувачами класів, буде створено два екземпляри класу singleton, по одному для кожного завантажувача класів.


Значення серіалізації в шаблоні Singleton

Якщо клас Singleton є Serializable, ви можете серіалізувати примірник Singleton. Після серіалізації ви можете десеріалізувати його, але він не поверне єдиний об’єкт.

оператор if-else java

Щоб вирішити цю проблему, потрібно перевизначити метод readResolve(). який забезпечує дотримання єдиного елемента. Він викликається одразу після десеріалізації об’єкта. Він повертає єдиний об’єкт.

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

Розуміння реального прикладу шаблону Singleton

  • Ми збираємося створити клас JDBCSingleton. Цей клас JDBCSingleton містить свій конструктор як приватний і власний приватний статичний екземпляр jdbc.
  • Клас JDBCSingleton надає статичний метод для передачі свого статичного екземпляра зовнішньому світу. Тепер клас JDBCSingletonDemo використовуватиме клас JDBCSingleton для отримання об’єкта JDBCSingleton.

припущення: ви створили таблицю userdata, яка має три поля uid, uname та upassword у базі даних mysql. Ім’я бази даних – ashwinirajput, ім’я користувача – root, пароль – ashwini.

Файл: 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 
Файл: 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); } } 

завантажте цей приклад шаблону Singleton

Вихід