• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wzorzec projektowy Singleton - do czego?

Object Storage Arubacloud
0 głosów
599 wizyt
pytanie zadane 10 kwietnia 2017 w C i C++ przez niezalogowany
Witam, ostatnio na zajęciach dostałem zadanie napisania czegoś co używa Singleton'a. Co mogę dzięki temu wzorcowi napisać?

4 odpowiedzi

+3 głosów
odpowiedź 10 kwietnia 2017 przez Surykat Stary wyjadacz (14,780 p.)
Do niczego. :D

Boleśnie się tym ostatnio przekonałem. W małych projektach to nie problem, ale w większych potrafi narobić zamieszania- o takiego singletona trzeba BEZ PRZERWY dbać i pilnować jego stanu, aby ów był spójny z tym co się dzieje w aplikacji, bo można się zaskoczyć.
komentarz 10 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

I popieram i się zgadzam "ręcyma i nogami". Jak potrzeba Singleton'a to w 80% wystarcza Monostate lub zabronienie kopiowania lub jakaś sensowna kontrola kreacji. Tym bardziej że z Singletonem w C++ jest problem z jego niszczeniem.

Drugim takim "pariasem wzorców" jest Metoda Szablonowa. Komuś się wydawało że będzie dobrze, a wyszło jak zawsze... :-/ Ale w odróżnieniu od Singletona który jest do ... niestosowania, Metoda Szablonowa czasem może być ok :-)

komentarz 10 kwietnia 2017 przez draghan VIP (106,230 p.)

Polecam zajrzeć do tego wątku, który powstał w wyniku odnogi jakiejś innej dyskusji (szczególnie warto przeczytać komentarze adrian17 pod moją odpowiedzią).

komentarz 10 kwietnia 2017 przez niezalogowany
edycja 11 kwietnia 2017
Nie wiem czy źle sformułowałem moje pytanie, czy po prostu odbiegliśmy nieco od tematu, ale wydaje mi się, że w dalszym ciągu nie uzyskałem odpowiedzi na moje pytanie. Wiem co wiąże się z używaniem tego wzorca, sam wykładowca nie zalecał jego używania, lecz dostałem zadanie, żeby wykonać program używający Singletona i nie mam pomysłu co mógłbym przy jego pomocy napisać. Stąd moje pytanie w jakim programie mogę użyć Singletona (obiło mi się o uszy, że można go wykorzystać, np. przy systemie logowania).
komentarz 10 kwietnia 2017 przez Surykat Stary wyjadacz (14,780 p.)
Moja odpowiedź była takim trochę pobocznym wtrętem, w razie gdyby ktoś czytał ten wątek za rok. Co by nie miał wątpliwości...

Napisz prosty logger więc. Widzę, że jesteś początkujący- tutaj nie chodzi o logowanie użytkowników, a o logowanie przepływu aplikacji, np do pliku tekstowego- co by nie było wątpliwości. ;)

Np program wykonuje jakąś operację, a twój logger wrzuci do konsoli/pliku treść: "Jestem w metodzie X, zmienna Y ma wartość Z". Jak wyleci błąd, to logujesz do konsoli coś w stylu "Poleciał wyjątek. Oto błąd" + errorMessage.
komentarz 11 kwietnia 2017 przez event15 Szeryf (93,790 p.)
Lol factory method złym wzorcem? Jeden częściej wykorzystywanych wzorców kreacyjnych w DDD i to takie złe ;x
+1 głos
odpowiedź 10 kwietnia 2017 przez gromula Stary wyjadacz (10,070 p.)
Cześć,

Singleton daje możliwość zwracania tylko jednej instancji danej klasy, która jest ogólno dostępna. Czyli np dobre jest do tworzenia połączenia z bazą. Gdyż zawsze chcemy otrzymać ten sam obiekt.
Przyrównując dwa obiekty stworzone z singletona otrzymamy to samo.
Sam singleton jest uznawany jako antywzorzec łamie zasadę SOLID'a,

(S)- jednej odpowiedzialności - klasa powinna mieć tylko jedną odpowiedzialność

(O)otwarte/zamknięte. Przy zmianie wymagań nie powinien być zmieniany stary działający kod, ale dodany nowy które rozszerza zachowanie.
komentarz 10 kwietnia 2017 przez ShiroUmizake Nałogowiec (46,300 p.)

 Czyli np dobre jest do tworzenia połączenia z bazą. Gdyż zawsze chcemy otrzymać ten sam obiekt.

Nie zastosowałbym, po pierwsze za duża odpowiedzialność w momencie gdy mamy wiele tabel i pakujemy dosyć duży złożony Obiekt. Plus dwa brak elestatycznośći (SOLID) albo tworzenie potwora by w ciągu dalszym zapewnić elastyczność. A tu się pojawia problem jak testować tego potwora (spora ilośc mocków). Lepiej się do tego nadaje Repository. Nie wspominając o contextBounds (Choć osobiście nie zalecałbym wystawiać dostęp do klasy dla szerszej publiczności (interface).

https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/

Singleton bardziej mi pasuje jako jakieś GUI. 

0 głosów
odpowiedź 10 kwietnia 2017 przez Benek Szeryf (90,870 p.)

Spróbuj się przebić przez design patterns for humans.

0 głosów
odpowiedź 10 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

A no to masz... oparty o CRTP https://en.wikipedia.org/wiki/Curiously_recurring_template_patter

#include <iostream>
#include <string>

template<class T>
class Singleton {
public:
	static T& getInstance() {
		static T _instance;
		return _instance;
	}

protected:
	Singleton() {}
	virtual ~Singleton() {}

private: 
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
};

class IsSingleton: public Singleton<IsSingleton> {
public:
    std::string getName() const {
        return name;
    }

	void setName(const std::string& newName) {
		name = newName;
	}

protected:
	friend class Singleton<IsSingleton>;
	IsSingleton(): name{"empty"} {}

private: 
    std::string name;
};

int main() {

	IsSingleton& s1 = IsSingleton::getInstance();
	IsSingleton& s2 = IsSingleton::getInstance();

    std::cout << ">>>Default getName()<<<\n";
	std::cout << s1.getName() << '\n'
        << s2.getName() << '\n';

    std::cout << ">>>Set value<<<\n";
	s1.setName("Singe instance");
	std::cout << s1.getName() << "\n";
	std::cout << s2.getName() << "\n";

    std::cout << ">>>Addresses<<<\n";
    std::cout << "s1 address = " << &s1 << '\n'
        << "s2 address = " << &s2 << '\n';
    
} 

Podobne pytania

+1 głos
2 odpowiedzi 448 wizyt
pytanie zadane 26 października 2019 w C i C++ przez AuriattaDev Początkujący (390 p.)
0 głosów
1 odpowiedź 354 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
1 odpowiedź 178 wizyt

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...