- דפוס עיצוב Singleton ב-Java
- היתרון של תבנית Singleton
- שימוש ב-Singleton Pattern
- דוגמה לתבנית Singleton
תבנית סינגלטון אומרת את זה פשוט 'להגדיר מחלקה שיש לה רק מופע אחד ומספקת לו נקודת גישה גלובלית'.
במילים אחרות, מחלקה חייבת להבטיח שיש ליצור רק מופע בודד ואובייקט בודד יכול לשמש את כל המחלקות האחרות.
ישנן שתי צורות של דפוס עיצוב יחיד
- מופע מוקדם: יצירת מופע בזמן טעינה.
- מופע עצלן: יצירת מופע בעת הצורך.
יתרון של דפוס עיצוב Singleton
- חוסך זיכרון מכיוון שלא נוצר אובייקט בכל בקשה. רק מופע בודד נעשה שימוש חוזר שוב ושוב.
שימוש בדפוס עיצוב Singleton
- דפוס סינגלטון משמש בעיקר ביישומי ריבוי הליכים ומסד נתונים. הוא משמש ברישום, שמירה במטמון, בריכות שרשורים, הגדרות תצורה וכו'.
דפוס עיצוב Uml of 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
אם מחלקה יחידה נטענת על ידי שני מחלקות מחלקות, ייווצרו שני מופעים של מחלקות יחיד, אחד עבור כל מחלק מחלקות.
המשמעות של סריאליזציה בדפוס סינגלטון
אם מחלקת הסינגלטון ניתנת להסדרה, אתה יכול לעשות סדרה של מופע הסינגלטון. ברגע שהוא עובר בסידרה, אתה יכול להפוך אותו לסידריאליזציה אבל זה לא יחזיר את האובייקט הסינגלטוני.
מיתר היפוך ב-c
כדי לפתור בעיה זו, עליך לעקוף את שיטת 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, שם המשתמש הוא שורש, הסיסמה היא 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); } }
הורד את דוגמה זו של Singleton Pattern