- Singleton dizaino modelis Java
- „Singleton Pattern“ pranašumas
- Singleton modelio naudojimas
- Singleton modelio pavyzdys
Singleton Pattern sako, kad tiesiog „apibrėžti klasę, kuri turi tik vieną egzempliorių ir suteikia visuotinį prieigos prie jos tašką“.
Kitaip tariant, klasė turi užtikrinti, kad būtų sukurtas tik vienas egzempliorius, o vieną objektą galėtų naudoti visos kitos klasės.
Yra dvi vienodo dizaino modelio formos
- Ankstyvas paleidimas: egzemplioriaus kūrimas įkėlimo metu.
- Tingus egzistavimas: prireikus sukurti egzempliorių.
Singleton dizaino modelio pranašumas
- Taupo atmintį, nes objektas nėra sukuriamas kiekvienu užklausimu. Tik vienas egzempliorius naudojamas vėl ir vėl.
Singleton dizaino modelio naudojimas
- Singleton modelis dažniausiai naudojamas kelių gijų ir duomenų bazių programose. Jis naudojamas registruojant, kaupiant talpykloje, gijų telkiniuose, konfigūracijos nustatymuose ir kt.
Uml Singleton dizaino raštas
Kaip sukurti „Singleton“ dizaino modelį?
Norėdami sukurti viengubo klasę, turime turėti statinį klasės narį, privatų konstruktorių ir statinį gamyklos metodą.
- Statinis narys: Dėl statiškumo jis gauna atmintį tik vieną kartą, jame yra Singleton klasės egzempliorius.
- Privatus konstruktorius: Tai neleis sukurti Singleton klasės egzempliorių iš klasės ribų.
- Statinis gamyklos metodas: Tai suteikia visuotinį prieigos prie Singleton objekto tašką ir grąžina egzempliorių skambinančiajam.
Ankstyvojo Singleton modelio egzistavimo supratimas
Tokiu atveju mes sukuriame klasės egzempliorių statinių duomenų nario deklaravimo metu, todėl klasės egzempliorius sukuriamas klasės įkėlimo metu.
Pažiūrėkime pavienio dizaino modelio pavyzdį naudojant ankstyvą egzempliorių.
Failas: 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 } }
Suprasti tingų „Singleton“ modelio egzistavimą
Tokiu atveju klasės egzempliorių sukuriame sinchronizuotu būdu arba sinchronizuotu bloku, todėl prireikus sukuriamas klasės egzempliorius.
Pažiūrėkime paprastą pavienio dizaino modelio pavyzdį, naudojant tingų instituciją.
Failas: 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“ reikšmė „Singleton“ šablone
Jei viengubą klasę įkelia du klasių įkėlikliai, bus sukurti du viengubos klasės egzemplioriai, po vieną kiekvienam klasės įkėlikliui.
Serializacijos reikšmė Singleton Pattern
Jei pavienio tipo klasė yra serializuojama, galite suskirstyti vienkartinį egzempliorių. Kai jis bus serijinis, galite jį deserializuoti, bet jis negrąžins vieno objekto.
java pseudokodas
Norėdami išspręsti šią problemą, turite nepaisyti readResolve() metodas kad įgyvendina viengubą. Jis iškviečiamas iškart po to, kai objektas yra deserializuotas. Tai grąžina vienetinį objektą.
public class A implements Serializable { //your code of singleton protected Object readResolve() { return getA(); } }
Realaus Singleton modelio pavyzdžio supratimas
- Mes ketiname sukurti JDBCSingleton klasę. Šioje JDBCSingleton klasėje yra privatus konstruktorius ir privatus statinis egzempliorius jdbc.
- „JDBCSingleton“ klasė suteikia statinį metodą, kad jo statinis egzempliorius būtų nukreiptas į išorinį pasaulį. Dabar JDBCSingletonDemo klasė naudos JDBCSingleton klasę, kad gautų JDBCSingleton objektą.
Prielaida: sukūrėte lentelę userdata, kurioje yra trys laukai uid, uname ir upassword mysql duomenų bazėje. Duomenų bazės pavadinimas yra ashwinirajput, vartotojo vardas yra root, slaptažodis yra ashwini.
Failas: 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 classFailas: 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); } }
atsisiųskite šį „Singleton Pattern“ pavyzdį