2011-12-29 13 views

Odpowiedz

3

Singletony są złe, jeśli je rozwijasz. Jeśli korzystasz z wtyczki zależności, pozwól, aby kontener DI obsługiwał pojedynczą naturę obiektu usługi. Jeśli nie używasz wtrysku zależności, użyj metody statycznej zamiast pojedynczej.

klasycznym przykładem źle:

public class HootUtility // singleton because developer was a goofball. 
{ 
    ... 
    public void blammy(...) { ... } 
    public HootUtility getInstance() { ... } 
} 

... somewhere in the code. 

HootUtility.getInstance().blammy(...); // This is silly. 

Lepsza realizacja powyższego:

public class HootUtility // Not a singleton because I am not a ______. (fill in the blank as you see fit) 
{ 
    // You can limit instantiation but never prevent instantiation. 
    // google "java reflection" for details. 
    private HootUtility() 
    { 
    throw new UnsuppotedOperationException(); 
    } 

    public static void blammy(...) { ... } 
} 

... somewhere in the code. 

HootUtility.blammy(...); 

Jeśli masz interfejs usługi, który ma konkretną implementację, użyj ramy wtrysku zależność wstrzyknąć realizację (Ramy DI obejmują: wiosnę i guice).

Edycja: Gdybym używał sprężyny, wybrałabym zakres singletonu (domyślny).

+0

Interesujące podejście do zgłaszania wyjątku w konstruktorze. Osobiście zostawiłem to puste. Czy robisz to w swoim kodzie produkcyjnym? –

+0

Jeśli używam Spring DI, czy zakres powinien być "Singleton" czy "Prototype"? – Jyotirup

+0

Ogólnie, zgadzam się z tobą. Niemniej jednak opcja nr 1 jest rozsądnym rozwiązaniem, jeśli obiekt (singleton) musi utrzymywać stan wewnętrzny. – home

5

IMHO tak, usługi nie powinny mieć statusu i dlatego należy je składać pojedynczo.

+0

Teraz, jeśli zrobisz to pojedynczo, uderzamy w wydajność w przypadku, gdy aplikacja wymaga intensywnej obsługi, np. Istnieje duża liczba trafień dla klasy usług – Jyotirup

+3

@Jyotirup Właściwe użycie singletonu nie wpłynie na wydajność (jeśli cokolwiek, to poprawi to) –

+0

@Peter Tworzenie singletonu spowoduje, że wystąpi tylko jedna instancja tej klasy obsługująca wszystkie moje żądania. Tak więc teraz, jeśli mam 10 żądań dla klasy usług, będzie obsługiwać żądania sekwencyjnie, więc będzie opóźnienie w działaniu ... wydajność osiągnie, jeśli zwiększę liczbę żądań – Jyotirup

0

nr

Właściwie uważam, że nie powinien dbać o nią podczas projektowania. Podobnie jak w przypadku architektury @DwB, należy wykonać to zadanie. Ponadto uważam, że nie ma zakresu ("prototyp") powinien być domyślny i nie widzę niczego złego, jeśli ktoś sam go utworzy. Również ten problem można uprościć przez modularyzację i oddzielenie interfejsu usługi od implementacji, zgodnie z zalecanymi najlepszymi praktykami.

+0

to nowy obiekt klasy usług na każde zgłoszenie złe podejście? – Jyotirup

+0

@Jyotirup Nie sądzę. Jeśli są wolne od stanu, możesz zmienić i używasz DI poprawnie, możesz go łatwo zmienić w dowolnym momencie. –

+1

Powiedziałbym, że byłoby to złe podejście do prototypu. Zastanów się, czy wykonujesz tysiące żądań w swojej aplikacji internetowej, a nawet setkach. To są setki instancji inicjowanej klasy. Koncepcyjnie, jeśli stworzenie klasy i jej zależności (np. Prototypy dao z połączeniami db) jest wystarczająco kosztowne, usługi prototypowania mogą prowadzić do szybszego niszczenia, szczególnie w przypadku DDoS. Usługi świadczone pojedynczo z ramami typu DI, takie jak Spring @Autowired, zmniejszyłyby niepotrzebny przydział zasobów – user3466773

Powiązane problemy