logo

Oblikovalski vzorec Singleton v Javi

  1. Oblikovalski vzorec Singleton v Javi
  2. Prednost vzorca Singleton
  3. Uporaba vzorca Singleton
  4. Primer vzorca Singleton

Singleton Pattern pravi, da samo 'definiraj razred, ki ima samo en primerek in zagotavlja globalno točko dostopa do njega'.

Z drugimi besedami, razred mora zagotoviti, da je treba ustvariti samo en primerek in da lahko vsi drugi razredi uporabljajo en objekt.

Obstajata dve obliki enodelnega načrtovalnega vzorca

  • Zgodnja instancacija: ustvarjanje primerka v času nalaganja.
  • Leni primerek: ustvarjanje primerka, kadar je to potrebno.

Prednost oblikovalskega vzorca Singleton

  • Prihrani pomnilnik, ker se objekt ne ustvari ob vsaki zahtevi. Znova in znova se uporablja samo en primerek.

Uporaba vzorca načrtovanja Singleton

  • Vzorec Singleton se večinoma uporablja v večnitnih aplikacijah in aplikacijah za baze podatkov. Uporablja se pri beleženju, predpomnjenju, naborih niti, konfiguracijskih nastavitvah itd.

Uml vzorca načrtovanja Singleton


Kako ustvariti oblikovalski vzorec Singleton?

Za ustvarjanje razreda singleton moramo imeti statičnega člana razreda, zasebnega konstruktorja in statično tovarniško metodo.

  • Statični član: Zaradi statike dobi pomnilnik samo enkrat, vsebuje primerek razreda Singleton.
  • Zasebni graditelj: Preprečil bo instanciranje razreda Singleton zunaj razreda.
  • Statična tovarniška metoda: To zagotavlja globalno točko dostopa do objekta Singleton in vrne primerek klicatelju.

Razumevanje zgodnje instancije vzorca Singleton

V takem primeru izdelamo primerek razreda v času deklaracije statičnega podatkovnega člana, tako da je primerek razreda ustvarjen v času nalaganja razreda.

Oglejmo si primer vzorca enojezičnega oblikovanja z uporabo zgodnje instancije.

Datoteka: 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 } } 

Razumevanje lene instancije vzorca Singleton

V takem primeru ustvarimo primerek razreda v sinhronizirani metodi ali sinhroniziranem bloku, tako da se primerek razreda ustvari, ko je to potrebno.

Oglejmo si preprost primer načrtovalnega vzorca enojnega elementa z uporabo lene instancije.

Datoteka: 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 } } 

Pomen nalagalnika razredov v vzorcu Singleton

Če razred singleton naložita dva nalagalnika razredov, bosta ustvarjena dva primerka razreda singleton, eden za vsak nalagalnik razredov.


Pomen serializacije v vzorcu Singleton

Če je razred singleton Serializable, lahko serializirate primerek singleton. Ko je serializiran, ga lahko deserializirate, vendar ne bo vrnil objekta singleton.

pretvori niz v char java

Če želite rešiti to težavo, morate preglasiti metoda readResolve(). ki uveljavlja singleton. Pokliče se takoj po deserializaciji objekta. Vrne enojni objekt.

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

Razumevanje pravega primera vzorca Singleton

  • Ustvarili bomo razred JDBCSingleton. Ta razred JDBCSingleton vsebuje svoj konstruktor kot zasebni in zaseben statični primerek jdbc.
  • Razred JDBCSingleton zagotavlja statično metodo za prenos statične instance v zunanji svet. Zdaj bo razred JDBCSingletonDemo uporabil razred JDBCSingleton za pridobitev objekta JDBCSingleton.

Predpostavka: ustvarili ste tabelo userdata, ki ima tri polja uid, uname in upassword v bazi podatkov mysql. Ime baze podatkov je ashwinirajput, uporabniško ime je root, geslo je ashwini.

Datoteka: 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 
Datoteka: 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); } } 

prenesite ta primer Singleton Pattern

Izhod