Deo zbornika Uvod u softversko inženjerstvo

Jedinac (Singleton)

Jedinac (en. singleton) je projektni obrazac koji obezbeđuje da postoji samo jedan globalni objekat određene vrste. Iako može delovati da ih ima više, svi “primerci” zapravo pokazuju na istu strukturu.

Glavna svrha singltona je da obezbedi jedinstvenu instancu koja upravlja nekim zajedničkim resursima ili stanjem. Klasa koja ga primenjuje ima samo jednu instancu kojom upravlja sama, i sprečava bilo kog drugog da kreira njenu instancu.

Singlton je jedan od jednostavnijih obrazaca dizajna. Ovaj obrazac se tako implementira da pokušaj kreiranja nove instance kreira singleton samo za prvi poziv, te vraća pokazivače na njega u narednim pozivima.

Upotreba

Singlton obrazac se obično koristi u sledećim slučajevima:

  • vođenje globalnog stanja aplikacije
  • centralna klasa koja upravlja vezama baze podataka
  • rukovanje postavkama
  • deljenje resursa između različitih delova aplikacije

U video igrama, singlton obrazac se često koristi za upravljanje globalnim stanjem i resursima, kao što su:

  • Menadžer zvuka (SoundManager) – Jedina instanca koja upravlja svim zvučnim efektima i muzikom u igri.
  • Menadžer igre (GameManager) – Globalni objekat koji prati stanje igre (pobednik, trenutni nivo, broj poena, itd.). Ovo omogućava pristup različitim aspektima igre sa bilo kog dela koda.
  • Menadžer čuvanja (SaveManager) – Upravlja globalnim podacima o napretku u igri, kao što su sačuvane igre, postavke, itd.

Primer u Javi

Revnosna inicijalizacija

Primer revnosne (eager) implementacije singularnog obrasca, koja odmah stvara instancu:

public class Singleton {
    private static Singleton instance = new Singleton();
 
    private Singleton() {}
 
    public static Singleton getInstance() {
        return instance;
    }
}

Lenja inicijalizacija

Primer lenje (lazy) implementacije singularnog obrasca, koja kreira instancu tek kada se pozove getInstance():

public class Singleton
{
  // privatni konstruktor sprečava generisanje podrazumevanog javnog konstruktora
  private Singleton() {}

  private static class SingletonHolder
  {
    private final static Singleton INSTANCE = new Singleton();
  }

  public static Singleton getInstance()
  {
    return SingletonHolder.INSTANCE;
  }
}

Primer u JS-u

Implementacija pomoću objekta

Pošto u JavaScriptu objekti mogu postojati bez klase, svaki objekat je jedinac. Najprostija implementacija unikatnog obrasca se vrši pomoću običnog objekta:

const jedinac = {}

Implementacija pomoću klase

Možemo koristiti i klasu da implementiramo singlton:

let primerak = null

class Jedinac {
  constructor() {
    if (!primerak) {
      primerak = this
    }
    return primerak
  }
}

const jedinac = new Jedinac()

// 1000 linija dalje u kodu ...
const jedinac2 = new Jedinac()
console.log(jedinac === jedinac2)

Iako koristimo naredbu new, zapravo se kreira samo jedna instanca, koja se vraća u narednim pozivima. Ako slučajno pokušamo da napravimo više instanci u programu, klasa će uvek vraćati isti objekat.

P.s. Promenljiva primerak ne treba da bude globalna, već zatvorena u modul.

Literatura