Wpisany przez Kamil Dworak,
01 września 2010 20:03
Singleton to konstrukcyjny wzorzec projektowy. Wyobraź sobie, że w naszym programie potrzebujemy obiektu, który będzie zainicjowany tylko jeden raz. Tak, ograniczamy się tylko do pojedynczej instancji dla danej klasy. Ale po co komu w ogóle taki obiekt? Załóżmy, że
będzie on zawierał w sobie bardzo ważne informacje, może zawierać jakieś statystyki bądź ważne ustawienia. Ponowna inicjalizacja mogłaby spowodować przekłamanie oraz nieumyślną zmianę zapisanych ustawień. Otrzymane wyniki będą niespójne. Kolejnym przykładem zastosowania singletona jest oszczędność pamięci przez programistę. Sam użytkownik nawet nie wie, czy owa instancja już istnieje, czy też nie. W programach wielowątkowych istnieje pewne ryzyko błędu, spowodowanego stosowaniem wzorca. Może dojść do sytuacji, że dwa wątki, w tym samym czasie będą chciały zainicjować obiekt, w skutek czego powstają nam dwa singletony w systemie.
Schemat wzorca:
Schemat wzorca:
- Tworzymy tablicę obiektów klasy MenedzerPlikow
- Inicjujemy 1 element tablicy tab[0] (wywołujemy metodę dawaj Menedzer).
- Klasa zawiera statyczne pole instancja, wspólne dla wszystkich obiektów, początkowo posiada ono wartość NULL.
- W metodzie dawajMenedzer dokonujemy sprawdzenia, czy pole instancja posiada już jakąś wartość, jeżeli nie, odpalamy prywatny konstruktor i zwracamy nasza instancje do programu głównego. Po drodze wygenerowaliśmy identyfikator obiektu.
- Pora na kolejny element tablicy tab[1].
- Pole instancja, jak napisałem wyżej, jest wspólne dla wszystkich obiektów klasy, więc jest już ono zainicjowane. Nie generujemy już po raz kolejny identyfikatora, ani nie używamy konstruktora, natomiast informujemy użytkownika o tym, że dany obiekt został już wcześniej zainicjowany. Zwracamy istniejącą instancję.
- Tak samo postępujemy z elementem
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Kamil Dworak | C# | Visual Studio 2008 | .cs | .cs | ***** / 6 |
Kamil Dworak | Java | .java | .java | ***** / 9 |
Poprawiony: 01 września 2010 20:13
Komentarze
-13
#
Arek
2010-10-21 16:11
Jeśli stosowana jest notacja UML, to nazwa metody "dawajMenedzer" powinna być podkreślona. W przeciwnym wypadku oznacza metodę instancji a nie klasy. A skoro oznacza metodę instancji to należaloby stworzyć jakoś tą instancje ergo negujemy ideę sigletona.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz