- Java'da Singleton tasarım deseni
- Singleton Deseninin Avantajı
- Singleton Deseninin Kullanımı
- Singleton Deseni Örneği
Singleton Pattern şunu söylüyor: 'Yalnızca bir örneğe sahip olan ve ona küresel bir erişim noktası sağlayan bir sınıf tanımlayın'.
Başka bir deyişle, bir sınıf yalnızca tek bir örneğin oluşturulmasını ve tek bir nesnenin diğer tüm sınıflar tarafından kullanılmasını sağlamalıdır.
Singleton tasarım deseninin iki biçimi vardır
- Erken Örnekleme: yükleme sırasında örneğin oluşturulması.
- Tembel Örnekleme: Gerektiğinde örneğin oluşturulması.
Singleton tasarım modelinin avantajı
- Her istekte nesne oluşturulmadığı için bellekten tasarruf sağlar. Yalnızca tek bir örnek tekrar tekrar kullanılır.
Singleton tasarım deseninin kullanımı
- Singleton modeli çoğunlukla çok iş parçacıklı ve veritabanı uygulamalarında kullanılır. Günlüğe kaydetme, önbelleğe alma, iş parçacığı havuzları, yapılandırma ayarları vb. işlemlerde kullanılır.
Singleton tasarım deseninin Uml'si
Singleton tasarım deseni nasıl oluşturulur?
Singleton sınıfını oluşturmak için sınıfın statik üyesine, özel kurucuya ve statik fabrika yöntemine ihtiyacımız var.
- Statik üye: Statik olduğundan hafızayı sadece bir kez alır, Singleton sınıfının örneğini içerir.
- Özel inşaatçı: Singleton sınıfının sınıfın dışından başlatılmasını önleyecektir.
- Statik fabrika yöntemi: Bu, Singleton nesnesine genel erişim noktası sağlar ve örneği arayan kişiye döndürür.
Singleton Deseninin Erken Örneklenmesini Anlamak
Bu durumda, statik veri üyesini bildirirken sınıfın örneğini oluştururuz, böylece sınıfın örneği, sınıf yükleme sırasında oluşturulur.
Erken örneklemeyi kullanan tekil tasarım deseni örneğini görelim.
Dosya: 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 Deseninin Tembel Örneklenmesini Anlamak
Böyle bir durumda sınıfın örneğini synchronized method veya synchronized blokta oluştururuz, böylece gerektiğinde sınıfın örneği oluşturulur.
Tembel örneklemeyi kullanan tekil tasarım deseninin basit örneğini görelim.
Dosya: 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 } }
Singleton Deseninde Classloader'ın Önemi
Singleton sınıfı iki sınıf yükleyici tarafından yüklenirse, her sınıf yükleyici için bir tane olmak üzere iki singleton sınıfı örneği oluşturulacaktır.
Singleton Deseninde Serileştirmenin Önemi
Singleton sınıfı Serileştirilebilir ise singleton örneğini seri hale getirebilirsiniz. Serileştirildikten sonra seri durumdan kaldırabilirsiniz ancak singleton nesnesini döndürmez.
dünyanın en iyi gülüşü
Bu sorunu çözmek için geçersiz kılmanız gerekir. readResolve() yöntemi bu singleton'u zorlar. Nesne seri durumdan çıkarıldıktan hemen sonra çağrılır. Singleton nesnesini döndürür.
public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } }
Singleton Deseninin Gerçek Örneğini Anlamak
- Bir JDBCSingleton sınıfı oluşturacağız. Bu JDBCSingleton sınıfı, yapıcısını özel olarak ve kendisinin özel bir statik örneği olan jdbc'yi içerir.
- JDBCSingleton sınıfı, statik örneğini dış dünyaya ulaştırmak için statik bir yöntem sağlar. Artık JDBCSingletonDemo sınıfı, JDBCSingleton nesnesini almak için JDBCSingleton sınıfını kullanacaktır.
Varsayım: mysql veritabanında uid, uname ve upassword olmak üzere üç alana sahip bir kullanıcı verileri tablosu oluşturdunuz. Veritabanı adı ashwinirajput, kullanıcı adı root, şifre ashwini.
Dosya: 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 classDosya: 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); } }
bu Singleton Desen Örneği'ni indirin