Co oznacza singleton?

0

Czy może ktoś wytłumaczyć mi co oznacza singleton?

0

Byłem już na Wiki ale nadal nie do końca rozumiem. Czy możesz wytłumaczyć mi jak osobie kompletnie początkującej?

0

Osobie początkującej to wytłumaczyłbym to tak:

"Singleton – kreacyjny wzorzec projektowy, którego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu."

9

To jest taka konstrukcja kiedy potrzebujesz tylko jedną instancję jakiegoś obiektu w całej aplikacji. Przykładem może być połączenie z bazą danych, albo np. timer/scheduler który co pewien czas uruchamia jakieś akcje. Zasadniczo w całej aplikacji nie potrzeba tych obiektów więcej, bo jeden jest w stanie wszystko obsługiwać. Singleton ułatwia "pozyskiwanie" takiego obiektu (więc w prosty sposób z dowolnego miejsca możesz się odwołać do tej bazy danych na przukład) i kontroluje też żeby nikt przypadkiem nie tworzył takich obiektów. Może tak być że mamy ograniczoną liczbę połączeń z bazą danych i bardzo nie chcielibyśmy żeby ktoś nam nagle utworzył ich 1000 ;]

4

Globalna zmienna w obiektowym świecie.

0

Prosty przykład pisany w niczym :D Ma to tylko pokazać zasadę działania

class Klasa{
	private static obj = null; //referencja do jedynego obiektu statyczna

	private zmienna; // pole klasy

	private Klasa(){ this.zmienna = 2; } // konstruktor prywatny tutaj robisz sobie obiekt tej klasy ustawiasz zmienne początkowe i takie tam

	public static getObj() { // metoda która pozwoli ci się dostać do obiektu

		if(Klasa.obj == null){ //jeśli nie masz jeszcze obiektu tej klasy
			Klasa.obj = new Klasa();// stwórz go
		} 
		return Klasa.obj;//i zwróć obiekt
	}
}

potem możesz się odwołać do tego tak

Klasa.getObj().zmienna = 5;
2

Moja definicja: singletony to zło, którego zwykle pragniesz uniknąć.

Jest to zmienna globalna na dopalaczu, i chociaż dopalacze są kuszące, to jednak nie zmienia to tego, że jest to zmienna globalna, czyli zło (którego czasem nie da się uniknąć).

Singleton ułatwia "pozyskiwanie" takiego obiektu

no dobra, ale równie dobrze można sobie "gdzieś tam" utworzyć ten obiekt globalny reprezentujący Połączenie z bazą danych i potem przekazywać te Połączenie dalej na zasadzie wstrzykiwania zależności, coś w tym rodzaju:

connection = new DBConnection();
customerTable = new DBTable(connection);
productTable = new DBTable(connection);

tym sposobem też połączenie będzie jedno, a przy okazji nie będziemy korzystać ze zmiennej globalnej (czyli moduł/klasa będą bardziej niezależne), a także będziemy mogli podstawić obiekt innej klasy (np. przy testowaniu albo jeśli będziemy chcieli wprowadzić jakieś zmiany w programie, np. wprowadzić obsługię wielu połączeń z wieloma bazami danych). Nie mówię, że singletony nie przydają się, ale póki co widzę mało zalet, w porównaniu chociażby z dependency injection.

dodanie znacznika <code class="java"> - @furious programming

0

@LukeJL ależ oczywiście że kontenery IoC (bo jak rozumiem to masz na myśli w kontekście DI) są lepsze! Tylko że kontenery IoC to są relatywnie nowe zabawki. Wcześniej ich zwyczajnie nie bylo i trzeba było pisac singletony i service locatory. Młody jesteś to mało widziałeś :P

0

Po co używać singleton jak można zrobić klasę statyczną?

1 użytkowników online, w tym zalogowanych: 0, gości: 1