نمط سينجلتون يقول ذلك فقط 'حدد فئة تحتوي على مثيل واحد فقط وتوفر نقطة وصول عالمية إليها'.
بمعنى آخر، يجب أن تتأكد الفئة من إنشاء مثيل واحد فقط وإمكانية استخدام كائن واحد بواسطة جميع الفئات الأخرى.
هناك نوعان من نمط التصميم المفرد
- المحاكاة المبكرة: إنشاء المثيل في وقت التحميل.
- مثيل كسول: إنشاء المثال عند الاقتضاء.
الاستفادة من نمط التصميم المفرد
- يحفظ الذاكرة لأنه لا يتم إنشاء الكائن عند كل طلب. يتم إعادة استخدام مثيل واحد فقط مرارًا وتكرارًا.
استخدام نمط التصميم المفرد
- يستخدم نمط Singleton في الغالب في التطبيقات متعددة الخيوط وقواعد البيانات. يتم استخدامه في التسجيل والتخزين المؤقت وتجمعات الخيوط وإعدادات التكوين وما إلى ذلك.
Uml من نمط تصميم Singleton
كيفية إنشاء نمط تصميم 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 } }
فهم المثيل البطيء لنمط Singleton
في مثل هذه الحالة، نقوم بإنشاء مثيل للفئة بطريقة متزامنة أو كتلة متزامنة، لذلك يتم إنشاء مثيل للفئة عند الحاجة.
دعونا نرى المثال البسيط لنمط التصميم المفرد باستخدام الإنشاء البطيء.
الملف: 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
إذا تم تحميل فئة مفردة بواسطة محملي فئة، فسيتم إنشاء مثيلين للفئة المفردة، واحد لكل أداة تحميل فئة.
أهمية التسلسل في نمط Singleton
إذا كانت فئة المفرد قابلة للتسلسل، فيمكنك إجراء تسلسل لمثيل المفرد. بمجرد إجراء تسلسل له، يمكنك إلغاء تسلسله ولكنه لن يعيد الكائن المفرد.
يحتوي على طريقة جافا
لحل هذه المشكلة، تحتاج إلى تجاوز طريقة قراءة الحل (). الذي يفرض المفرد. يتم استدعاؤه مباشرة بعد إلغاء تسلسل الكائن. تقوم بإرجاع الكائن المفرد.
public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } }
فهم المثال الحقيقي لنمط Singleton
- سنقوم بإنشاء فئة JDBCSingleton. تحتوي فئة JDBCSingleton هذه على مُنشئها كمثيل خاص وثابت خاص jdbc لنفسها.
- توفر فئة JDBCSingleton طريقة ثابتة لتوصيل مثيلها الثابت إلى العالم الخارجي. الآن، ستستخدم فئة JDBCSingletonDemo فئة JDBCSingleton للحصول على كائن JDBCSingleton.
افتراض: لقد قمت بإنشاء جدول بيانات المستخدم الذي يحتوي على ثلاثة حقول uid وuname وuppassword في قاعدة بيانات 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 هذا