Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałHelena Walczak Został zmieniony 9 lat temu
1
Paweł Starzyk Obiektowe metody projektowania systemów
Design Pattern - Singleton Paweł Starzyk Obiektowe metody projektowania systemów
2
Paweł Starzyk Obiektowe metody projektowania systemów
Plan prezentacji Czym jest singleton i jak pracuje? Jaka jest jego struktura? Implementacja w C++ Przykłady zastosowania singletonu Singleton w aplikacjach wielowątkowych Wady i Zalety Bibliografia Paweł Starzyk Obiektowe metody projektowania systemów
3
Paweł Starzyk Obiektowe metody projektowania systemów
Czym jest singleton? Intencja singletonu wg Bandy Czworga: „Zapewnienie, że klasa posiada tylko jedną instancję oraz dostarczenie globalnego punktu dostępu do tej instancji”. Paweł Starzyk Obiektowe metody projektowania systemów
4
Paweł Starzyk Obiektowe metody projektowania systemów
Jak singleton pracuje? Specjalna metoda sprawdza czy obiekt został już utworzony Tworzy instancję i zwraca do niej referencję Zwraca referencję do wcześniej utworzonej instancji Konstruktor deklaruje się jako metodę o dostępie chronionym lub prywatnym (aby zapewnić, że wywołanie tej metody jest jedynym sposobem utworzenia obiektu) Paweł Starzyk Obiektowe metody projektowania systemów
5
Zadanie wzorca singletonu:
Umożliwia utworzenie dokładnie jednej instancji danej klasy i nie wymaga od obiektów użytkownika, by „wiedziały”, czy instancja ta została już utworzona Paweł Starzyk Obiektowe metody projektowania systemów
6
Paweł Starzyk Obiektowe metody projektowania systemów
Struktura singletonu Użytkownik tworzy instancję singletonu wyłącznie za pomocą metody pobierzInstancje Konstruktor deklarujemy jako metodę o dostępie prywatnym aby nie można się było nim posłużyć do utworzenia większej liczby instancji przez jego bezpośrednie wywołanie Paweł Starzyk Obiektowe metody projektowania systemów
7
Implementacja klasy w C++
class Singleton { public: static Singleton* Instance(); protected: Singleton(); private: static Singleton* _instance; }; Singleton* Singleton::_instance = 0 ; Singleton* Singleton::Instance () { if (_instance == 0) { instance = new Singleton; } return _instance; Paweł Starzyk Obiektowe metody projektowania systemów
8
Singleton jako Template
template <class TYPE> class Singleton { public: // Global access point static TYPE *instance (void); protected: // Default constructor. Singleton (void); // Contained instance. TYPE instance_; }; Paweł Starzyk Obiektowe metody projektowania systemów
9
Singleton jako Template
template <class TYPE> TYPE * Singleton::instance_ = 0; TYPE * Singleton::instance (void) { if (Singleton<TYPE>::instance_ == 0) { Singleton<TYPE>::instance_ = new Singleton<TYPE>; } return Singleton<TYPE>::instance_; }; Paweł Starzyk Obiektowe metody projektowania systemów
10
Przykład zastosowania singletonu
Paweł Starzyk Obiektowe metody projektowania systemów
11
Paweł Starzyk Obiektowe metody projektowania systemów
Przykładowy kod #include <iostream> using namespace std; class Singleton { private: static Singleton *single; Singleton() {} // default constructor Singleton(const Singleton& s) {} // copy constructor public: static Singleton* getInstance(); // The interface of the class. void method(); }; Paweł Starzyk Obiektowe metody projektowania systemów
12
Paweł Starzyk Obiektowe metody projektowania systemów
cd przykładowy kod Singleton* Singleton::single = NULL; Singleton* Singleton::getInstance() { if(single == NULL) single = new Singleton; return single; } else void Singleton::method() cout << "Method of the singleton class" << endl; Paweł Starzyk Obiektowe metody projektowania systemów
13
Paweł Starzyk Obiektowe metody projektowania systemów
Cd przykładowy kod int main() { Singleton *sc1,*sc2, *sc3; sc1 = Singleton::getInstance(); sc1->method(); sc2 = Singleton::getInstance(); sc2->method(); sc3 = Singleton::getInstance(); sc3->method(); if (sc1 == sc2) cout<<"OK. The same pointer"<<endl; else cout<<"Not the same !!!"<<endl; if (sc1 == sc3) return 0; } Paweł Starzyk Obiektowe metody projektowania systemów
14
A gdy aplikacja jest wielowątkowa?
Dwa wątki wywołują pobierzInstancje w tym samym czasie Pierwszy z wątków sprawdza że instancja nie istnieje i wykonuje kod związany z jej utworzeniem Drugi wątek sprawdza, czy referencja do instancji klasy jest pusta a że pierwszy wątek jeszcze nie utworzył obiektu, to wykonuje kod związany z utworzeniem instancji W obu wątkach zostają utworzone osobne instancje klasy Paweł Starzyk Obiektowe metody projektowania systemów
15
…co powoduje niepożądane efekty
Stały ubytek wolnej pamięci (usuwana tylko jedna instancja) Błędy trudne do odnalezienia jeśli obiekt singletonu charakteryzuje się określonym stanem Paweł Starzyk Obiektowe metody projektowania systemów
16
Rozwiązanie to wzorzec blokowania dwufazowego
Sprawdzenie warunku istnienia singletonu Synchronizacja operacji Powtórne sprawdzenie czy obiekt nie został utworzony Paweł Starzyk Obiektowe metody projektowania systemów
17
Paweł Starzyk Obiektowe metody projektowania systemów
Prostsze rozwiązanie Gdy jesteśmy pewni, iż w naszym programie będzie nam potrzebny obiekt danej klasy to zamiast stosować wzorzec singletonu możemy w klasie umieścić zmienną statyczną przechowującą referencję do obiektu Paweł Starzyk Obiektowe metody projektowania systemów
18
Paweł Starzyk Obiektowe metody projektowania systemów
Wady i Zalety Co gdy aplikacja jest wielowątkowa? Oszczędność miejsca na dysku Kontrola dostępu do instancji Operacje są bardziej przejrzyste Łatwość zmieniania liczby instancji Paweł Starzyk Obiektowe metody projektowania systemów
19
Paweł Starzyk Obiektowe metody projektowania systemów
Bibliografia „Design Patterns. Elements of Reusable Object-Oriented Software ” – E. Gamma, R. Helm, R. Johnson, J. Vlissides „DESIGN PATTERNS EXPLAINED, new perspective on obiect-oriented design ” – A. Shalloway, J. R. Trott „Wzorce projektowe” – A. Shalloway, J. R. Trott Paweł Starzyk Obiektowe metody projektowania systemów
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.