Nigdy nie znalazłem dobrych odpowiedzi na te proste pytania dotyczące klas pomocniczych / użytkowych:
Dlaczego miałbym utworzyć singleton (bezstanowy) zamiast używać metod statycznych?
Po co byłoby potrzebne wystąpienie obiektu, skoro obiekt nie ma stanu?
java
design-patterns
singleton
Sebastien Lorber
źródło
źródło
Odpowiedzi:
Często singletony są używane do wprowadzenia jakiegoś stanu globalnego do aplikacji. (Szczerze mówiąc, częściej niż jest to konieczne, ale to temat na inny raz.)
Istnieje jednak kilka narożnych przypadków, w których nawet bezstanowy singleton może być przydatny:
Przykład: obiekty synchronizacji dla instrukcji C #
lock
lub Javasynchronized
.Przykład:
Toolkit.getDefaultToolkit()
metoda w Javie zwróci singleton, którego dokładny typ zależy od systemu.Przykład:
DBNull.Value
w C #.źródło
Mogłem zobaczyć przypadek użycia bezstanowego singletona zamiast statycznej klasy metod, a mianowicie dla Dependency Injection .
Jeśli masz pomocniczą klasę funkcji narzędziowych, których używasz bezpośrednio, tworzy ona ukrytą zależność; nie masz kontroli nad tym, kto może go używać i gdzie. Wstrzyknięcie tej samej klasy pomocniczej za pośrednictwem bezstanowej pojedynczej instancji pozwala kontrolować, gdzie i jak jest używana, a także zastępować ją / mockować / itp., Kiedy trzeba.
Uczynienie go pojedynczym wystąpieniem zapewnia po prostu, że nie przydzielasz więcej obiektów tego typu niż to konieczne (ponieważ potrzebujesz tylko jednego).
źródło
Właściwie znalazłem inną odpowiedź, o której tutaj nie wspomniano: metody statyczne są trudniejsze do przetestowania.
Wygląda na to, że większość frameworków testowych świetnie sprawdza się przy mockowaniu metod instancji, ale wiele z nich nie radzi sobie w przyzwoity sposób z mockowaniem metod statycznych.
źródło
W większości zajęć z języków programowania wymyka się wiele z systemu typów. Chociaż klasa ze swoimi statycznymi metodami i zmiennymi jest obiektem, bardzo często nie może implementować interfejsu ani rozszerzać innych klas. Z tego powodu nie może być stosowany w sposób polimorficzny, ponieważ nie może być podtypem innego typu. Na przykład, jeśli masz interfejs
IFooable
, który jest wymagany przez kilka sygnatur metod innych klas, obiekt klasyStaticFoo
nie może być używany zamiastIFooable
, podczas gdyFooSingleton.getInstance()
can (zakładając,FooSingleton
implementujeIFooable
).Proszę zauważyć, że tak jak skomentowałem odpowiedź Heinziego, singleton jest wzorcem kontrolującym instancję. Zastępuje
new Class()
sięClass.getInstance()
, co daje autorowiClass
większą kontrolę nad przypadkach, które może wykorzystać w celu zapobiegania tworzenia zbędnych przypadkach. Singleton to po prostu bardzo szczególny przypadek wzorca fabrycznego i tak powinien być traktowany. Powszechne użycie sprawia, że jest to raczej szczególny przypadek rejestrów globalnych, co często kończy się błędem, ponieważ rejestry globalne nie powinny być używane tylko dla woli.Jeśli planujesz zapewnić globalne funkcje pomocnicze, metody statyczne będą działać dobrze. Klasa nie będzie działać jako klasa, ale raczej jako przestrzeń nazw. Sugeruję, abyś zachował wysoką spójność, albo możesz skończyć z najdziwniejszymi problemami z połączeniem.
greetz
back2dos
źródło
Istnieje kompromis między używaniem tego. Singletony mogą mieć stan lub nie i odnoszą się do obiektów. Jeśli nie zachowują stanu i są używane tylko do dostępu globalnego, statyczne jest lepsze, ponieważ te metody będą szybsze. Ale jeśli chcesz wykorzystać obiekty i koncepcje OOP (polimorfizm dziedziczenia), to singleton jest lepszy.
Rozważmy przykład: java.lang.Runtime to klasa pojedyncza w java. Ta klasa umożliwia różne implementacje dla każdej maszyny JVM. Implementacja jest pojedyncza na JVM. Gdyby ta klasa była statyczna, nie możemy przekazać różnych implementacji opartych na JVM.
Ten link okazał się bardzo pomocny: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?
Mam nadzieję, że to pomoże!!
źródło
Dla mnie „Want Object State użyj Singleton, Want Function użyj metody statycznej”
To zależy od tego, czego chcesz. Ilekroć chcesz mieć stan obiektu (np. Polimorfizm, taki jak stan Null zamiast
null
lub stan domyślny), singleton jest odpowiednim wyborem dla Ciebie, podczas gdy metoda statyczna jest używana, gdy potrzebujesz funkcji (odbieraj dane wejściowe, a następnie zwracaj dane wyjściowe).Polecam w przypadku singletona, po utworzeniu instancji powinien być zawsze w tym samym stanie. Nie powinien być klonowalny ani przyjmować żadnej wartości do ustawienia (z wyjątkiem statycznej konfiguracji z pliku, np. Pliku właściwości w java).
PS Wydajność między tymi dwoma różni się w milisekundach, więc najpierw skup się na architekturze .
źródło
Singleton nie jest bezstanowy, posiada stan globalny.
Oto kilka powodów, dla których przychodzi mi do głowy używanie Singleton:
źródło