Modele de proiectare - Un ghid rapid pentru modelul Singleton.

Acesta este un alt ghid rapid pentru stăpânirea unui model de design foarte frecvent utilizat, modelul Singleton. Modelul Singleton este unul dintre cele mai simple, dar mai controversate modele de design (cu argumente pro și multe contra). Acesta este unul dintre principalele motive pentru care este foarte frecvent întâlnit în programarea interviurilor.

Modelul Singleton este clasificat în tiparele de creație creatoare, care se referă la instantiația clasei / obiectului. Mai precis, modul de utilizare eficientă a moștenirii (tipare de creare a clasei) sau a delegării (modele de creare a obiectelor). [după modelele de design explicate simplu]

Definiția Singleton: În matematică, este definit ca „un set care conține exact un element”. Acest model este foarte simplu de înțeles și ușor de implementat, deoarece este doar câteva linii de cod, iar aplicația este destul de simplă. Este un model care asigură că o clasă are o singură instanță și oferă un punct de acces global la aceasta. De exemplu, putem avea un singur Papa activ al Italiei, prin urmare, este posibil ca Papa să poată fi reprezentat cu un model Singleton.

Pasul 1 - Cuvinte cheie

Definirea cuvintelor cheie este rețeta secretă din această serie de ghiduri rapide. Această metodă m-a ajutat să înțeleg cu adevărat modelele de design, să le codează în minte și să înțeleg diferențele dintre alte modele de design.

De data aceasta, cuvintele cheie ne duc o călătorie înapoi la elementele de bază. Este o introducere a codului foarte simplu care va urma. Simțiți-vă liber să săriți la pasul următor dacă vă simțiți confortabil cu termenii.

  1. Clasa-instanta: o instanta este o aparitie concreta a oricarei obiecte. Există de obicei în timpul rulării unui program de calculator și se subliniază în identificarea distinctă a obiectului. În mod similar, instanțele de clasă sunt create din clase de subrutine precum constructori / distrugători.
  2. Constructor privat: un constructor privat este un constructor de instanță special. Este utilizat în general în clase care conțin numai membri statici. Dacă o clasă are unul sau mai mulți constructori privați și nu are constructori publici, atunci alte clase (cu excepția claselor cuibărite) nu au voie să creeze instanțe din această clasă.
  3. Membrii de date statice: Când declaram un membru al unei clase ca static înseamnă că indiferent de câte obiecte ale clasei sunt create, există o singură copie a membrului static. [din TutorialPoint]
  4. Funcție statică: o funcție statică de membru poate fi numită chiar dacă nu există obiecte ale clasei. [din TutorialPoint]

Pasul 2 - diagrama

Există unul-două trucuri de programare pentru a face o clasă Singleton. În afară de asta, este destul de banal. Citind diagrama de sus în jos: ar trebui să avem

  • O instanță statică (subliniată) și privată (-) a clasei
  • Un constructor privat.
  • O funcție publică (+) și statică care returnează instanța.

Definirea clasei nu ar trebui să fie mai mult de 7–8 linii de cod, în funcție de limbajul de programare.

Pasul 3 - Cod de exemplu

Vă sugerez să copiați clasa de cod pe clasă din depozitul meu de git „Andreas Poyias” sau din fragmentele de aici și să-l lipiți în oricare dintre editorii C ++ online disponibili, cum ar fi c ++ shell, jdoodle, onlineGDB și să-l executați pentru a observa ieșirea. Apoi citiți comentariile sau descrierea de mai jos.

Definiția clasei
Prezint definiția clasei în C ++, care este 8 linii de cod.

#include 
clasa Singleton
{
public:
    static Singleton * getInstance ();
privat:
    Singleton () {}
    static Singleton * s_instance;
};

Acum trecem la declarația metodei getInstance () și a membrului static de date care se află în afara definiției clasei. Există diferite modalități de a scrie funcția getInstance. Pentru simplitate, l-am ales pe cel prezentat în fragmentul de mai jos. Deci, dacă instanța nu există, instantanezi una dacă există, atunci întoarce-o.

Singleton * Singleton :: s_instance = 0;
Singleton * Singleton :: getInstance ()
{
    if (! s_instance) {
        s_instance = nou Singleton ();
        std :: cout << "Nu există nicio instanță, așa că am creat una. \ n";
        return s_instance;
    } Else {
        std :: cout << "Hei, aceasta este aceeași instanță! \ n";
      return s_instance;
    }
}

Functie principala
Funcția principală funcționează ca client. Clientul nu poate crea o a doua instanță a Clingletonclass și este obligat să o utilizeze pe cea existentă. Acest lucru poate fi afișat și la ieșire.

int principal ()
{
 Singleton * singlA = Singleton :: getInstance ();
 Singleton * singlB = Singleton :: getInstance ();
 returnare 0;
}
// Iesire
// Nu există nicio instanță, așa că am creat una.
// Hei, aceasta este aceeași instanță!

Există câteva avantaje pentru utilizarea modelului Singleton. Alte modele de design, cum ar fi Abstract Factory, Facade pot utiliza modelul Singleton (de obicei este necesar doar un obiect de fațadă). Așa cum am menționat în primul paragraf, acest model de design este destul de controversat și de aceea o întrebare populară de interviu este: „ce este în neregulă cu modelul Singleton sau de ce este considerat modelul Singleton anti-model?”

Anti-model
Voi rezuma motivele pentru care singletonul este considerat anti-model. Există o discuție foarte populară cu privire la StackOverflow, care oferă o justiție foarte bună care să justifice motivul pentru care ar trebui să fim atenți cu acest model de design.

  1. Modelele Singleton încalcă principiul responsabilității unice: în virtutea faptului că își controlează propria creație și ciclul de viață.
  2. Sunt utilizate în general ca o instanță globală care poate duce la dependențe ascunse ale codului care ar putea fi expuse prin interfețe.
  3. În mod inerent, fac ca codul să fie strâns cuplat.
  4. Este foarte dificil să ajustați modelul Singleton într-un mediu multithreading și foarte ușor să cadă în probleme de condiții de rasă în timpul inițializării.

Pentru o mai bună înțelegere a motivului pentru care acesta este considerat anti-model, aruncă o privire în acest site de către Michael Safyan.

Din moment ce am menționat mai sus, următorul blog va fi un ghid rapid pentru modelul de design al fațadei. Fațada nu este un model creațional precum Singleton și Abstract Factory, dar este clasificată ca model de design structural. Nu uitați să-mi place / să aplaudați pe blogul meu și să urmați contul meu. Acest lucru înseamnă să-mi ofer satisfacția că am ajutat unii colegi dezvoltatori și să mă împing să continui să scriu.

Alte ghiduri rapide privind modelele de proiectare:

  1. Modele de proiectare - Un ghid rapid pentru Abstract Factory.
  2. Modele de proiectare - Un ghid rapid pentru modelul Bridge.
  3. Modele de proiectare - Un ghid rapid pentru modelul Builder.
  4. Modele de proiectare - Un ghid rapid pentru modelul de decorare.
  5. Modele de proiectare - Un ghid rapid pentru modelul fațadelor.
  6. Modele de proiectare - Un ghid rapid pentru modelul de observare.
  7. Modele de proiectare - Un ghid rapid pentru modelul Singleton.