Singleton

sobota, 15 marca 2008

Wzorzec singleton pozwala na ograniczenie liczby egzemplarzy danej klasy do jednego. Klasa albo nie ma żadnych egzemplarzy, albo ma tylko jeden, nie więcej.

Typowym zastosowaniem tego wzorca jest sytuacja, gdy tworzenie egzemplarza klasy wiąże się z dużym kosztem. Najlepszym przykładem jest klasa komunikacji z bazą danych. Zakładająć, że będziemy się komunikować z jedną bazą danych, wykorzystanie wzorca singletona będzie najlepszym rozwiązaniem.

Implementcja w php wygląda najczęśniej tak: Tworzymy statyczne pole prywatne przechowujące instancje klasy, statyczną publiczną metodę getInstance(), która zwraca nowy egzemplarz naszej klasy, a gdy jest wywoływana po raz kolejny zwraca obiekt utworzony podczas pierwszego wywołania. Deklarujemy konstruktor jako prywatny, aby zapobiec tworzeniu obiektów klasy poprzez new.

class Singleton {
    private static $_instance=null;
    private function __construct(){ }
    public static function getInstance(){
        if (self::$_instance == null){
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }
}
/** Aby utworzyć obiekt danej klasy korzystany z konstrukcji*/
$Singleton = Singleton::getInstance();

Ponieważ metoda getInstance jest statyczna, a obiekt danej klasy jeszcze nie istnieje, nie możemy się odwołać do pola $instance w taki sposób $this->_$instance. Trzeba zrobić to przez self::

Społeczność: Powiązane posty:

Komentarze

  1. diabl0

    Warto dodać że konstruktor (ciągle jako prywatny) można wykorzystać np. do inicjalizacji połączenia z bazą danych czy innej operacji która ma się wykonać przy pierwszym użyciu singletona. Co ważne kod konstruktora zostanie wywołany tylko raz za pierwszym pobraniem instancji.

  2. Szymon

    Moje skromne uwagi:
    1. Do obsługi bazy danych dużo lepszym rozwiązaniem wydaje się wzorzec Factory.
    2. Klasa, której kod przedstawiłeś powyżej, może posiadać więcej instancji.. zapomniałeś wspomnieć o magicznej metodzie __clone(). Należy ją przeciążyć i wyrzucić wyjątek, który spowoduje fatal error - dzięki temu mamy pewność, że w naszym systemie istnieje tylko jedna instancja danej klasy.

  3. dr_med

    Pierwszy wpis i od razu Singleton. Przeczytaj http://steve.yegge.googlepages.com/singleton-considered-stupid

  4. Hubert Marzec

    @ dr_med Tak często singleton jest uważany za anty-wzorzec. Nie nadużywamy i stosowany w odpowiedni sposób nie stanowi problemu.

  5. Koziołek

    Zaczynam komentowanie od starszych wpisów bo lubię czytać blogi w całości.

    1. W php nie ma singletonów takich jak w np. Javie czy C++. Dlaczego? W momencie zakończenia przetwarzania skryptu niszczone są wszystkie obiekty. Biorąc pod uwagę brak stanowości dla żądania za każdym żądaniem zwracana jest nowa instancja singletonu. Można zatem powiedzieć, że w php masz singleton per request.
    2. @Szymon, nie masz racji. Przyjrzyj się kodowi. Pole przechowujące instancję jest statyczne, a zatem nawet utworzenie drugiego obiektu spowoduje, że nadal będziesz miał dostęp tylko do tego jednego pola wskazującego na pierwszą instancję.
    3. @dr_med, autor tego artykułu ma rację połowicznie. Z singletonami jest jak z wódką jak nadużywasz to masz problemy.

Dodaj komentarz