Wzorzec Singleton w JavaScripcie.

W dzisiejszym poście przedstawię implementację wzorca singleton w JavaScripcie. Ponadto postaram się omówić realną używalność tego wzorca w JSowych programach.

Jeżeli nie wiesz czym jest singelton i jak działa, zapraszam do lektury. Jest to wiedza z zakresu klasycznego programowania obiektowego, która na pewno przyda Ci się jako programiście. Wzorzec ten jest dość prosty a ja przedstawię temat w miarę jasno i opatrzę go odpowiednimi przykładami.

Wzorzec Singleton w JavaScripcie

Singleton to wzorzec, który pozwala na stworzenie jednej instancji obiektu. Jeżeli instancja taka już istnieje, nie można stworzyć drugiej. Do tego inicjalizacja tego obiektu odbywa się dopiero w momencie, w którym jest on potrzebny w programie. To są dwie najważniejsze cechy tego wzorca. Jeżeli struktura nie posiada obu tych cech, nie jest singletonem.

Ponieważ JavaScript jest wyjątkowy i nie jest bazuje na klasach a na prototypach, JSowa implementacja Singletonu też będzie wyjątkowa. Główną przyczyną wyjątkowości będzie to w jaki sposób inicjalizuje się obiekty. Przez to, JSowy Singleton będzie nie tyle podręcznikową klasą/obiektem, co strukturą.

Najlepiej wyobrazić sobie Singleton jako moduł (czym zresztą będzie), który enkapsuluje cały mechanizm inicjalizujący instancję tegoż Singletona.

Najlepiej chyba jak przejdę do samej implementacji. Oczywiście jest wiele sposobów na stworzenie singletona, ale ten który pokaże jest najczęściej przytaczany i działa całkiem nieźle. Oto JavaScriptowy singleton:

Wbrew pozorom struktura ta działa w bardzo prosty sposób. Za pomocą samowywołującej się funkcji tworzę Singleton, czyli moją klasę/moduł. Ma ona tylko jedną „publiczną” metodę (to ta zwracana w returnie na końcu), initialize.

Metoda initialize, zwraca wewnętrzny obiekt instance, czyli instancje singletona. Jeśli instancja nie jest zdefiniowana, najpierw przypisuje do niej wyniki wewnętrznej metody innerInit. Ta metoda to kolejny moduł, który również może mieć swoje „publiczne” i „prywatne” właściwości. To jest instancja singletona. Oczywiste jest, że mogę stworzyć tylko jedną. Jeżeli próbowałbym przypisać instancję singletona do innej zmiennej, po prostu skopiował bym referencję do tej, która już istnieje:

Instancja singletona powstaje dopiero, kiedy zostanie wywołana metoda initialize. Mam więc spełnione, wszystkie warunki wzorca. Singleton ma tylko jedną metodą jako swoje „API”. Tworzy ona instancje, o ile taka już nie istnieje, dopiero wtedy, kiedy jest ona potrzebna. Sama instancja ma własne pola i metody, zarówno zewnętrzne jak i wewnętrzne.

Jeżeli chodzi o używanie singletona, nie ma tu żadnych haczyków. Po prostu warto skorzystać z niego wtedy, kiedy potrzebny jest obiekt, który nie może mieć więcej niż jednej instancji oraz nie musi być zainicjalizowany od razu. Najczęściej są to jakieś punkty kontrole w programie, pilnujące przebiegu programu w innych modułach.

Trzeba pamiętać, że taka implementacja singletona, zaśmieca globalny zakres. Zawsze warto zastanowić się, czy nie lepiej po prostu użyć zwykłego modułu. Według mnie, problemy może zrodzić się też z tego, że singleton dąży do tego aby robić wiele rzeczy na raz. Nie tylko kontroluje swoja instancje ale też to w jaki sposób jest inicjalizowana.

To tyle na dziś 🙂 . Na koniec, jak zawsze, zachęcam do polubienia mojej strony na facebooku. Zawsze na bieżąco zamieszczam tam informacje o nowościach, więc warto polubić aby nie przegapić żadnego nowego wpisu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *