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

bo klasy statycznej nie można dziedziczyć, nie można wydzielić interfejsu i zamockować do testów

2

tak czy inaczej singleton to antywzorzec i łamie niemal wszystkie zasady programowania obiektowego
używa się go raczej tylko z lenistwa a potem jest płacz i łzy gdy się okazuje że jednak potrzeba więcej obiektów danego typu (na przykład równoległe połączenie z drugą bazą danych). Wtedy zazwyczaj następuje generowanie kodu metodą copy-pastego i burdel w kodzie

singleton jest równie zły jak zmienne globalne
a z możliwości dziedziczenia czy mockowania singletona i tak zazwyczaj się nie korzysta, bo co nam da zamockowanie obiektu jeżeli wszędzie dalej w kodzie są odwołania typu KonkretnaKlasa.getInstance(). ...

1
spartanPAGE napisał(a):

Globalna zmienna w obiektowym świecie.

Bardziej: sposób na uzyskanie wyjścia na obiektowy świat (przy założeniu że singleton to Registry).

http://securesoftwaredev.com/2009/03/01/the-registry-pattern/

Innym sposobem na uzyskanie dostępu do tego świata/kontekstu (niektórzy sądzą że jedynie słusznym) jest DI (Dependency Injection) lub IoC (Inversion of Control).
Pewnie jeśli się poruszasz tylko w ramach Javy to mają rację. Chociaż nawet w Javie opcjonalne (lazy) pobieranie obiektu z kontenera DI jest właściwie użyciem wzorca "Rejestru".

2

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ąć).

Analogia nie jest zbyt dokładna, bo można mieć niemutowalny (bezstanowy) singleton. I kiedy już robimy takie daleko idące analogie, to niemutowalny singleton byłby odpowiednikiem stałej globalnej. A co jest złego w stałych globalnych? Nic.

łamie niemal wszystkie zasady programowania obiektowego

No jakie niby to "zasady programowania obiektowego łamie"?

używa się go raczej tylko z lenistwa a potem jest płacz i łzy gdy się okazuje że jednak potrzeba więcej obiektów danego typu

Wtedy się robi refactoring. Poza tym na ogół właśnie nie okazuje się, że potrzeba więcej obiektów. Wtedy używanie DI zamiast singletona będzie overkillem i może się skończyć tak: https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition. Innymi słowy: YAGNI.

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