Singleton Pattern

Singleton sau “instanta unica” este un design pattern creational. Acesta constrange numarul obiectelor pe care o clasa le defineste. Singleton-ul este frecvent intalnit la definirea accesului la resurse “unice” in sistem precum:

  • baze de date
  • resurse hardware (registri, componente harware: modem, gps, gprs …)

Problema

Vorbim aici de existenta unei aplicatii ce necesita una si doar o singura instanta a unui obiect. Suplimentar se poate observa si nevoia de un access global la acelasi obiect, dar si posibilitatea de a initializa cu intarziere resursa ce este controlata de singleton.

Situatia de fapt

Crearea unei class ce este unic instantiabila, obiectul rezultat are rol in crearea, initializarea, accesul si protectial resursei gestionate. O clasa ce implementeaza acest pattern contine un membru static privat de tipul clasei in sine. De asemenea clasa ofera o functie statica publica ce contine tot codul necesar initializarii si accesului la instanta gestionata privat.

Toti clientii ce folosesc aceasta clasa apeleaza functia ce permite accesul (folosind numele clasei si operatorul “scope resolution”) ori de cate ori o referinta la instanta unic gestionata este necesara.

Folosirea singletonului trebuie considerata doar daca urmatoarele criterii sunt satisfacute:

  • Gestiunea instantei unice nu poate fi rezonabil aleasa
  • Initializarea cu intarziere este posibila si dorita
  • Accesul global nu este altfel posibil

Daca gestiunea instantei unice, cand si oricum ar fi facuta initializarea, si daca accesul global nu sunt considerate probleme, Singletonul nu este solutia necesara.

Singletonul nu poate fi extins pentru a oferi si gestiona accesul la un numar “specific” de instante definite la nivel de aplicatie.

Metoda statica folosita pentru initializarea si gestionarea accesului la resursa constrange clasa ce defineste singletonul in a putea fi mostenita, extinsa.

Distrugerea unui singleton este o problema de design adesea intalnita.

Structura

singleton1-2x

Este vorba de o clasa ce are o singura instanta, clasa ce este responsabila pentru initializarea obiectului la prima utilizare. Instanta este gestionata printr-un atribut privat static. Metoda prin intermediul careia se permite accesul este publica, statica.

Singleton-2x

Pasi necesari in crearea/definirea unui singleton

  1. Defineste un atribut privat si  static in clasa de ce gestioneaza “singura instanta”.
  2. Defineste o metoda publica si statica in clasa.
  3. Foloseste “lazy initialization” (creare la prima utilizare) in functia/metoda de access.
  4. Defineste constructorii ca fiind de tip protected sau private.
  5. Clientii pot folosi doar functia ce permite accesul la resursa gestionata de singleton

Reguli de baza

  • Singletonul poate fi folosit in combinatie cu alte patternuri Abstract Factory, Builder, sau Prototype.
  • Obiectele de tip Facade(Fatada) sunt de obicei Singleton-uri datorita faptului ca este nevoie doar de o instanta in functionarea normala.
  • Obiectele ce fac managementul starilor unui sistem sunt de asemenea de tip singleton.
  • Avantajul folosirii singletonului in raport cu variabilele globale este acela ca esti absolut sigur de numarul de instante rezultate in cursul vietii.
  • Singletonul este un pattern ce face parte dintr-un set de patternuri care sunt frecvent folosite gresit. Singletonurile sunt destinate pentru a fi utilizate in contextul in care o clasa trebuie sa fie unic instantiata, sa aiba exact o instanta, nimic mai mult. Programatorii/SW Designerii folosesc frecvent Singletonul in o incercare gresita de a inlocui variabilele globale. Singletonul este, ca scop si folosire, o variabila globala. Singletonul nu defineste ideea de variabila globala ci mai bine spus o reformuleaza.
  • Cand este singletonul nenecesar?: In majoritatea timpului! Intr-adevar este “probabil” mai simplu ca orice alte obiecte ce acceseaza astfel o “variabila” globala sa se foloseasca de singleton, dar cu siguranta este o abordare gresita:
    • codul devine greu testabil
    • codul devine greu lizibil
    • interfetele nu sunt clar definite
    • flexibilitatea in modificare este mult redusa

no responses for Singleton Pattern

    Leave a Reply

    Your email address will not be published. Required fields are marked *

    This site uses Akismet to reduce spam. Learn how your comment data is processed.