Wzorzec projektowy singleton

Stronę tą wyświetlono już: 14 razy

Opis wzorca projektowego singleton

Wzorzec projektowy singleton należy do wzorców kreacyjnych a jego celem jest ograniczenie możliwości tworzenia wielu instancji danej klasy. W podstawowym założeniu jest ograniczenie liczby możliwych do utworzenia obiektów danej klasy do jednej instancji. W C++ efekt ten uzyskuje się poprzez utworzenie prywatnego lub chronionego konstruktora klasy oraz statycznej metody tejże klasy zawierającej statyczną zmienną będącą instancją tejże klasy, która jest przez ową metodę zwracana.

Diagram UML wzorca projektowego singleton

Powiedzmy, że tworzę dziennik wpisów, który ma być dostępny globalnie i przechowywać wpisy. Nie potrzebuję więc większej liczby takich obiektów więc tworzę klasę LogBook, która ma prywatny konstruktor. Dzięki zastosowaniu statycznej metody getInstance użytkownik otrzymuje dostęp do jedynej instancji klasy LogBook.

Przykład diagramu UML wzorca projektowego singleton
Rys. 1
Przykład diagramu UML wzorca projektowego singleton

Przykładowa implementacja wzorca projektowego singleton w C++

Listing 1
  1. #include <iostream>
  2. #include <string>
  3. #include <time.h>
  4. #include <map>
  5. class LogBook{
  6. private:
  7. LogBook(){}; // prywatny konstruktor klasy
  8. std::map<time_t, std::string> logEntry; // tutaj wpisy przechowuję
  9. public:
  10. void addLogEntry(){
  11. std::string entry;
  12. std::cout<<"Podaj wpis: ";
  13. std::getline(std::cin, entry);
  14. time_t logEntryTime;
  15. time(&logEntryTime);
  16. logEntry[logEntryTime] = entry;
  17. std::cout<<std::endl;
  18. }
  19. void writeLogBook(){
  20. for(std::map<time_t, std::string>::iterator i = logEntry.begin(); i != logEntry.end(); i++){
  21. std::cout<<ctime(&i->first)<<std::endl;
  22. std::cout<<i->second<<std::endl<<std::endl;
  23. }
  24. }
  25. static LogBook& getInstance(){ // metoda statyczna zwracająca instancję obiektu
  26. static LogBook instance; // ta zmienna statyczna jest inicjalizowana tylko raz
  27. return instance;
  28. }
  29. };
  30. int main(){
  31. LogBook::getInstance().addLogEntry(); // pobieram wpis od użytkownika
  32. LogBook::getInstance().writeLogBook(); // wypisuję wpisy
  33. LogBook::getInstance().addLogEntry(); // pobieram kolejny wpis od użytkownika
  34. LogBook::getInstance().writeLogBook(); // wypisuję wpisy
  35. std::cin.get();
  36. return 0;
  37. }

Przykładowy wynik działania powyższego kodu:

Podaj wpis: Nam strzelać nie kazano

Fri Aug 04 16:52:32 2017

Nam strzelać nie kazano

Podaj wpis: Wstąpiłem na działo

Fri Aug 04 16:52:32 2017

Nam strzelać nie kazano

Fri Aug 04 16:52:41 2017

Wstąpiłem na działo
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/singleton - strona opisująca wzorzec projektowy singleton [En]
  2. pl.wikipedia.org - opis tego wzorca projektowego

Komentarze