Java - Singleton klasa (Singleton Class)


U ovoj ćemo lekciji naučiti implementovati Singleton Design Pattern u Javi uz pomoć primjera. U Javi, Singleton je uzorak dizajna koji osigurava da klasa može imati samo jedan objekt. Za kreiranje singleton klase, klasa mora implementovati sljedeća svojstva:

  • Kreiranje privatnog (private) konstruktora klase da ograničite kreiranje objekata izvan klase.
  • Kreiranje privatnog (private) atributa tipa klase koji se odnosi na pojedinačni objekt.
  • Krirajte javnu statičku metodu (public static) koja vam omogućava stvaranje i pristup objektu koji ste kreirali. Unutar metode stvorićete uslov koji vas ograničava u stvaranju više objekata.

Primjer: Sintaksa klase Java Singleton Class

class SingletonExample {

   // Privatno polje koje se odnosi na objekt
   private static SingletonExample singleObject;
                                              
   private SingletonExample() {
      // Konstruktor SingletonExample klase
   }

   public static SingletonExample getInstance() {
      // Pisati kod koji nam omogućuje stvaranje samo jednog objekta
      // Pristup objektu prema našim potrebama
   }
}

U gornjem primjeru:

  • private static SingletonExample singleObject - referenca na objekt klase.
  • private SingletonExample() - privatni konstruktor koji ograničava kreiranje objekata izvan klase.
  • public static SingletonExample getInstance() - ova metoda vraća referencu na jedini objekt klase. Budući da je metoda statična, može joj se pristupiti pomoću imena klase.


Korištenje Singletona u Javi

Singleton-ovi se mogu koristiti za rad s bazama podataka. Mogu se koristiti za kreiranje spremišta veza za pristup bazi podataka uz ponovnu upotrebu iste veze za sve klijente. Pogledajmo primjer:

class Database {
   private static Database dbObject;

   private Database() {      
   }

   public static Database getInstance() {

      // Kreiranje objekta ako već nije kreiran
      if(dbObject == null) {
         dbObject = new Database();
      }

       // Vraća singleton objekt
       return dbObject;
   }

   public void getConnection() {
       System.out.println("Sada ste povezani s bazom podataka.");
   }
}

class Main {
   public static void main(String[] args) {
      Database db1;

      // Odnosi se na jedini objekt baze podataka
      db1= Database.getInstance();
      
      db1.getConnection();
   }
}

Kada pokrenemo program, izlaz će biti:

Sada ste povezani s bazom podataka.

U našem primjeru:

  • Napravili smo singleton klasu Database.
  • DbObject je polje tipa klase. Ovo će se odnositi na objekt klase Database.
  • Privatni konstruktor Database() sprječava stvaranje objekata izvan klase.
  • Metoda statičkog tipa klase getInstance() vraća instancu klase u vanjski svijet.
  • U klasi Main imamo varijablu klase db1. Pozivamo getInstance() pomoću db1 da dobijemo jedini objekt baze podataka.
  • Metodi getConnection() se može pristupiti samo pomoću objekta Database.
  • Pošto Database može imati samo jedan objekt, svi klijenti mogu pristupiti bazi podataka putem jedne veze.

Važno je napomenuti da postoji samo nekoliko scenarija (poput evidentiranja) u kojima singlovi imaju smisla. Preporučujemo da izbjegavate potpuno korištenje singletona ako niste sigurni hoćete li ih koristiti ili ne. Saznajte više: Šta je loše u Singletonu?