2009-09-30 10 views

Odpowiedz

22

Każda klasa może implementować interfejs, a Singleton jest po prostu "normalną" klasą, która gwarantuje, że tylko jedna jej instancja istnieje w dowolnym momencie, niezależnie od logiki biznesowej, którą może zaimplementować. Oznacza to również, że Singleton ma co najmniej 2 obowiązki i nie jest to dobry projekt OO, ponieważ zajęcia powinny mieć tylko 1 odpowiedzialność i upewnić się, że są one dobre na tej odpowiedzialności, ale to już inna dyskusja.

+0

Dlaczego Singleton nie jest dobrym projektem OO? W rzeczywistości jest to jeden z najczęstszych wzorców projektowych OO. –

+2

@ChristianVielma: (Tak, późno) Problem polega na tym, że tworzy * stan globalny *, podobnie jak * zmienne globalne *, i cierpi z powodu podobnych problemów. Na przykład, trudno jest przetestować klasy, które wewnętrznie wymagają pojedynczych osób bez wiedzy z zewnątrz. Twoja produkcja DB jest pełna śmieci/danych testowych? Sprawdź dla singletonów. Polowanie na błąd? Jeśli masz pojedyncze, a więc globalne państwo, nie możesz po prostu skupić się na ograniczonym zakresie; musisz pamiętać o bazie kodu. Dziękuję singleton. Zauważ, że chodzi o singleton * pattern *, a nie singleton * objects *. Powszechne używanie nie oznacza, że ​​musi być "dobre". – ray

0

Singleton ma instancję - po prostu nigdy nie ma więcej niż jednej instancji. Prawdopodobnie używasz kilku statycznych elementów do pobierania referencji i aby upewnić się, że nigdy nie otrzymasz wielu wystąpień, ale w przeważającej części klasa jest taka sama jak każda inna klasa.

10

Coś jak:

public interface MyInterface 
{ 
} 

I

public class MySingleton implements MyInterface 
{ 
    private static MyInterface instance = new MySingleton(); 

    private MySingleton() 
    { 
    } 

    public static MyInterface getInstance() 
    { 
    return instance; 
    } 
} 
+2

Musisz dodać do tej klasy prywatny konstruktor no-args, aby był to singleton. –

+7

FYI, najlepszym sposobem w Javie do wdrożenia Singleton jest użycie wyliczenia pojedynczego elementu.Jest bardziej zwięzły niż podejście w terenie publicznym i zapewnia bezpłatny mechanizm szeregowania, a także zapewnia ochronę przed atakami refleksyjnymi. Ta metoda nie została jeszcze powszechnie przyjęta, ale może być interesująca. Aby uzyskać więcej informacji zobacz artykuł o tym w "Efektywna Java" Joshua Blocha. – nkr1pt

+0

@Andrew: dziękuję, odbijałem się między słowem a pracą dnia i tęskniłem za tym przez przypadek :-) –

0

Zasadniczo klasy Singleton jest klasa, która może być instancja jeden i tylko jeden raz. Wzorzec klasy singleton jest implementowany za pomocą statycznej metody, aby uzyskać wystąpienie klasy singleton i ograniczyć dostęp do jej konstruktorów.

Podobnie jak w przypadku interfejsu, byłby podobny do sposobu, w jaki każda inna klasa implementowałaby interfejs.

A także nie powinno pozwalać na klonowanie tego obiektu.

5

Myślę, że zrozumiałem twój problem. Chcesz zdefiniować metodę fabryki w interfejsie (metoda statyczna do getInstance()). Ale ponieważ metody fabryki nie można zdefiniować w interfejsie, ta logika nie zadziała.

Jedną z opcji jest posiadanie klasy fabrycznej, która przechowuje tę metodę statyczną. Więc nie będzie trzech klas pierwsza klasa trzymać statyczna metoda drugi interfejs trzeci jest beton klasy

Ale nie możemy uczynić konkretny konstruktora jako prywatny.

Ale jeśli infrastruktura ma dwa pakiety, jeden dla społeczeństwa i dla innych prywatnych

zdefiniować interfejs publicznie uczynić konkretny poziom pakietu klasy (bez żadnych modyfikatorów dostępu) i klasa fabryczne i metoda statyczna jawne.

Mam nadzieję, że to może ci pomóc.

Powiązane problemy