Wzorce projektowe (7)
Autor: Damian Chodorek • Opublikowany: 21 lipca 2015 • Kategoria: kursy, wzorce projektowe
Singleton.
Singleton to wzorzec obiektowy. Jego celem jest ograniczenie tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu.
Klasy
class Singleton{/*
może istnieć tylko jedna instancja tej klasy naraz, posiada statyczną metodę Singleton* instance()
*/};
Etapy działania
- Aby uzyskać dostęp do obiektu, wywołujemy statyczna metodę
Singleton* Singleton::instance()
i na zwróconym obiekcie wykonujemy operacje.
Konsekwencje
Zalety:
- kontrola dopuszczalnej liczby instancji jakie mogą istnieć w systemie,
- proces pobierania instancji jest niewidziany dla użytkownika, nie musi on wiedzieć czy instancja w chwili wywołania istnieje czy dopiero jest tworzona.
Wady:
- utrudnia testowanie aplikacji poprzez wprowadzenie zmiennej globalnej,
- należy zachować szczególną ostrożność przy wielowątkowości,
- jeśli istnieje kilka klas singletonów i są od siebie zależne, to może wystąpić problem martwych referencji.
Przykład
#include <iostream>
#include <string>
using namespace std;
//Definicja
class singleton
{
private:
singleton() {cout<<"konstruktor singletona"<<endl;}
~singleton() {cout<<"destruktor singletona"<<endl;}
singleton(const singleton &);
singleton& operator=(const singleton&);
public:
std::string method(const char* arr="singleton pattern") { return arr; }
static singleton& getInstance()
{
/*Inicjalizacja statycznego obiektu. Obiekt zostanie utworzony przy pierwszym wywołaniu tej metody i tylko wtedy nastąpi inicjalizacja przy pomocy konstruktora. Każde następne wywołanie jedynie zwróci referencję tego obiektu.
*/
static singleton instance;
return instance;
}
friend void rm();
};
void rm()
{
singleton::getInstance().~singleton();
}
struct temp
{
temp(){cout<<"konstruktor temp"<<endl;}
~temp(){cout<< singleton::getInstance().method("destruktor temp uzywa singletona")<<endl;}
};
int main(int argc, const char*argv[])
{
//Użycie
temp t;
{
singleton::getInstance();
rm();
}
}
W kolejnej części poznasz wzorzec Singleton Fenix, którego zadaniem jest zapobiegnięcie powstania problemu martwych referencji.