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

  1. 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.

część 8

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.