logo

Singleton tervezési minta Java nyelven

  1. Singleton tervezési minta Java nyelven
  2. A Singleton Pattern előnyei
  3. Singleton Pattern használata
  4. Példa Singleton mintára

Singleton Pattern azt mondja, hogy csak 'határozzon meg egy osztályt, amelynek csak egy példánya van, és globális hozzáférési pontot biztosít hozzá'.

Más szavakkal, egy osztálynak biztosítania kell, hogy csak egyetlen példányt hozzon létre, és egyetlen objektumot használjon az összes többi osztály.

A singleton tervezési mintának két formája létezik

  • Korai példányosítás: példány létrehozása betöltési időben.
  • Lusta példányosítás: szükség esetén példány létrehozása.

A Singleton tervezési minta előnye

  • Memóriát takarít meg, mert az objektum nem jön létre minden egyes kérésre. Csak egyetlen példány kerül újra és újra felhasználásra.

Singleton tervezési minta használata

  • Az Singleton mintát többnyire többszálas és adatbázis-alkalmazásokban használják. Naplózásban, gyorsítótárazásban, szálkészletekben, konfigurációs beállításokban stb. használják.

Uml Singleton tervezési minta


Hogyan készítsünk Singleton tervezési mintát?

A singleton osztály létrehozásához szükségünk van statikus osztálytagra, privát konstruktorra és statikus gyári metódusra.

  • Statikus tag: A statikusság miatt csak egyszer kap memóriát, a Singleton osztály példányát tartalmazza.
  • Egyéni kivitelező: Megakadályozza a Singleton osztály példányosítását az osztályon kívülről.
  • Statikus gyári módszer: Ez biztosítja a globális hozzáférési pontot a Singleton objektumhoz, és visszaküldi a példányt a hívónak.

Az Singleton Pattern korai példányosításának megértése

Ebben az esetben az osztály példányát a statikus adattag deklarálásakor hozzuk létre, így az osztály példánya az osztálybetöltéskor jön létre.

Nézzük a korai példányosítást használó singleton tervezési mintát.

Fájl: 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 } } 

Az Singleton Pattern lusta példányosításának megértése

Ebben az esetben az osztály példányát szinkronizált metódusban vagy szinkronizált blokkban hozzuk létre, így szükség esetén létrejön az osztály példánya.

Lássuk az egyszerű példát az egyszemélyes tervezési mintára lusta példányosítással.

Fájl: 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 } } 

A Classloader jelentősége a Singleton Patternben

Ha az egytagú osztályt két osztálybetöltő tölti be, akkor az egytagú osztály két példánya jön létre, mindegyik osztálybetöltőhöz egy.


A szerializálás jelentősége a Singleton Patternben

Ha az egytagú osztály Serializable, sorosozhatja az egytagú példányt. A szerializálás után deszerializálhatja, de nem adja vissza az egyszeres objektumot.

fibonacci kód java

A probléma megoldásához felül kell írnia a readResolve() metódus amely kikényszeríti a szinglit. Közvetlenül az objektum deszerializálása után hívják meg. Visszaadja a singleton objektumot.

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

A Singleton-minta valódi példájának megértése

  • Létre fogunk hozni egy JDBCSingleton osztályt. Ez a JDBCSingleton osztály a konstruktorát privátként és saját statikus jdbc-példányként tartalmazza.
  • A JDBCSingleton osztály egy statikus módszert biztosít statikus példányának a külvilágba juttatásához. Most a JDBCSingletonDemo osztály a JDBCSingleton osztályt fogja használni a JDBCSingleton objektum lekéréséhez.

Feltevés: létrehoztál egy userdata táblát, amely három mezőt tartalmaz: uid, uname és upassword a mysql adatbázisban. Az adatbázis neve ashwinirajput, a felhasználónév root, a jelszó ashwini.

Fájl: 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 
Fájl: 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); } } 

töltse le ezt a Singleton Pattern példát

Kimenet