Singleton DP

Svrha

Obezbeđivanje da klasa ima jedan primerak i da nije moguće slučajno ili namerno napraviti druge objekte te klase.

Kratak opis problema

class PrintManager{
   public static PrintManager Instance() {
      if (instance==null) instance=new PrintManager;
      return instance;
   }
protected PrintManager() {...}
private static PrintManager instance=null;
}

Jedna od važnih aktivnosti objektno-orijentisanih sistema je mogućnost kreiranja novih objekata.

Uglavnom se sistem za kreiranje novih objekata zasniva na instanciranju. U mnogim objektno-orijentisanim sistemima ponekad je neophodno ograničiti ili proširiti mogućnosti i način na koji se kreiraju novi objekti. Na primer, u pojedinim situacijama je bitno da u sistemu postoji samo jedan objekat koji je instanca neke određene klase. Takav je primer sistema u kome može biti nekoliko štampača, ali je nužno da postoji jedan i samo jedan objekat koji upravlja štampanjem, jer postojanje dva objekta za upravljanje štampanjem moglo bi rezultovati mešanjem ispisa na štampaču zbog dva različita zahteva za štampanje.

Upotreba Singleton DP

Ideja 1:

Programer kreira objekat samo na jednom mestu. Pokazivač na ovaj objekat bio bi smešten u nekoj javnoj promenljivoj, tako da svi objekti mogu da mu pristupe po potrebi.

Mane ideje 1:

Ne sprečava se da drugi delovi programa kreiraju svoje verzije ovog objekta (naročito ako se radi o relativno dužim programima čiji autor nije samo jedan programer) .

Ideja 2

Kreirati klasu koja ima zaduženja :kreiranje i pristup jedinstvenom objektu.
Direktno kreiranje (pozivanjem konstruktora) ovog objekta je onemogućeno, a pristup objektu dozvoljen je samo kroz specijalne metode ove klase.

class Singleton{
   private Singleton _instance = null;
   protected Singleton() {
     ...
   }
   public static Singleton instance() {
     if(this._instance == null) {
        this._instance = new Singleton(); }
      return this._instance; }
}

Rad sa objektom tipa Singleton odvija se preko promenljive _instance unutar klase Singleton. Ova promenljiva je privatna za klasu Singleton i niko joj "spolja" ne može pristupiti.

Jedini način za dobijanje reference na objekat je pozivanje metoda instance(), koji samo prilikom prvog poziva kreira novi objekat, dok prilikom svih sledećih poziva vraća pokazivač na taj objekat.
Konstruktor ove klase deklarisan je kao protected, što osigurava da niko van klase Singleton ne može da ga pozove i kreira objekte tipa Singleton.

 

Prednosti Singleton DP

  1. pristup objektu je kontrolisan , jer klasa Singleton enkapsulirajući svoj jedinstveni primerak, može da kontroliše kada i kako klijenti pristupaju toj instanci.
  2. smanjenje broja globalnih imena u programu
  3. dodatno doprinosi fleksibilnosti samog dizajna , jer je dozvoljeno redefinisanje operacija klase jedinstvenog objekta putem nasleđivanja. Jednostavno se može konfigurisati kojoj konkretnoj izvedenoj klasi pripada jedinstveni objekat kome se prostupa preko osnovne klase operacijom instance()
  4. postoji mogućnost kreiranja većeg (ali kontrolisanog!!!) broja objekata tipa Singleton (ako za to postoji potreba) -promenom metoda instance()

 

Poznati primeri upotrebe u (postojećim) realnim sistemima

Session class, WidggetKit class (u kompletu alata korisničkog interfejsa InterView)

Bliski DP

Neki DP mogu da se implementiraju pattern-om Singleton.


AbstractFactory
Builder
Prototype

Singleton DP može da sarađuje sa Observer DP-om u situaciji kada odnosi zavisnosti između subjekata i observera (videti Observer DP ) zbog svoje složenosti, zahtevaju postojanje nekog objekta ChangeManager-a.
Na primer, može da se dogodi da neka operacija obuhvata izmene nad više međusobno zavisnih subjekata. Tada je potrebno obavestiti observer-e tek nakon izmene svih subjekata, kao preventiva od pojave višestrukog obaveštavanja.
Stoga bi Change Manger bio zadužen da:


Kako je često u primenma ChangeManger jedinstven i globalno poznat objekat, jasno je da je u tu svrhu korisno upotrebiti SingletonDP.

 


 

← Mesto DP-a pri projektovanju Uvod Visitor DP →