2010-09-15 27 views
23

Możliwe duplikaty:
Difference between static class and singleton pattern?
What is the difference between a Singleton pattern and a static class in Java?Różnica między klasą singleton a klasą statyczną?

HI nie jestem jasno coraz Jaka jest różnica pomiędzy klasą singleton i klasy statycznej? Czy ktoś może to rozwinąć na przykładzie?

+5

Brzmi jak duplikat http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern – oksayt

+1

Nie zapomnij oznaczyć odpowiedzi jako zaakceptowanej, jeśli masz potrzebne informacje .. –

+0

sprawdź http://stackoverflow.com/a/37114702/1406510 – nanosoft

Odpowiedz

4

Jest to różnica między wzorcem a wprowadzeniem wzoru.

Wzór Singleton nie jest związany w szczególności z językiem Java. Mogą istnieć różne sposoby tworzenia lekcji na singleton, w zależności od używanego języka. Wiele języków OO używa odpowiednika zmiennych statycznych, aby utworzyć singleton, ale inne mogą używać różnych technik.

Niektóre sposoby implementacji singletonu są lepsze niż inne. Dobrym sposobem na wdrożenie Singleton jest prawidłowo hermetyzacji dostępu do tego Singleton za pomocą metody fabryki:

public class Example { 
    private static final Example SINGLETON = new Example(); 

    public Example getInstance() { return SINGLETON; } 

    private Example() { /* Constructor */ } 
} 

Stosując tę ​​technikę, można zrobić wszystkie rodzaje wyrafinowanych rzeczy: leniwy załadować Singleton, zastąpić ją niektórzy podklasę, zarządzaj inicjacją singletonów poprzez konfigurację i tak dalej.

+2

Jeśli twoja metoda 'getInstance()' nie jest 'statyczna', to jak potencjalny użytkownik może uzyskać instancję tej klasy, jeśli musi masz instancję, aby ją otrzymać? – winklerrr

1

A Singleton nie jest typem klasy, ale wzorem graficznym. Dzięki Singleton możesz (próbujesz) zagwarantować, że tylko jedna instancja danej klasy zostanie kiedykolwiek zbudowana w jednej wirtualnej maszynie Javy. Współczesne implementacje singletonowego wzoru używają wyrażeń, nawiasem mówiąc. Starsze implementacje używają prywatnego konstruktora i przechowują odniesienie do pojedynczej instancji w polu statycznym.

A klasa statyczna klasa statyczna jest zawsze klasą składową, która w przeciwieństwie do klasy wewnętrznej nie ma dostępu do zmiennych instancji otaczającej klasy.


Static przykład klasa

public class A { 
    public static class B {   
    }  
    public  int notAccessibleForB; 
    public static int accessibleForB; 
} 

Singleton (prosty starym stylu)

public final class Singleton { 
    public final static Singleton INSTANCE = new Singleton(); 
    private Singleton(){} 
} 

Singleton (prosty nowoczesny styl)

public enum Singleton { 
    INSTANCE; 
} 
16

Old que/ans na SO: Difference between static class and singleton pattern?

statyczna klasa to taka, która ma tylko metody statyczne, dla których lepszym słowem byłoby „funkcje”. Styl projektu zawarty w klasie statycznej jest czysto proceduralny.

Singleton, z drugiej strony, to wzór właściwy dla projektu OO.Jest to instancja przedmiotu (z wszystkimi możliwymi cechami, takimi jak polimorfizm), z procedurą tworzenia, która zapewnia, że ​​istnieje tylko jeden przypadek tej szczególnej roli przez całe jej życie.

16

Singleton Class: Klasa Singleton to klasa, z której może istnieć tylko jedna instancja dla programu ładującego klasy.

Klasa statyczna/pomocnicza (klasa z tylko statycznymi polami/metodami): Nie istnieje wystąpienie tej klasy. Tylko pola i metody mogą być bezpośrednio dostępne jako stałe lub metody pomocnicze.

Poniżej przedstawiono odniesienie z tego blog "Static classes in Java" opisuje to ładnie. Blog zawiera również przykłady dla wyjaśnienia sama:

Singleton przykład:

public class ClassicSingleton { 
    private static ClassicSingleton instance = null; 

    private ClassicSingleton() { 
     // Exists only to defeat instantiation. 
    } 

    public static ClassicSingleton getInstance() { 
     if (instance == null) { 
      instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

Static Class przykład:

/** 
* A helper class with useful static utility functions. 
*/ 
public final class ActionHelper { 

    /** 
    * private constructor to stop people instantiating it. 
    */ 
    private ActionHelper() { 
     // this is never run 
    } 

    /** 
    * prints hello world and then the users name 
    * 
    * @param users 
    *   name 
    */ 
    public static void printHelloWorld(final String name) { 
     System.out.println("Hello World its " + name); 
    } 

} 

Więc jaka jest różnica między tymi dwoma przykładami i dlaczego ja pomyśl, że drugie rozwiązanie jest lepsze dla klasy, której nie chcesz lub potrzebujesz utworzyć. Po pierwsze wzór Singleton jest bardzo użyteczny, jeśli chcesz utworzyć jedną instancję klasy. Dla mojej klasy pomocników tak naprawdę nie chcemy tworzyć kopii każdej klasy. Powodem, dla którego nie powinieneś używać klasy Singleton, jest to, że dla tej klasy pomocnika nie używamy żadnych zmiennych. Klasa singleton byłaby przydatna, gdyby zawierała zestaw zmiennych, których potrzebowaliśmy tylko w jednym zestawie i metodach wykorzystujących te zmienne, ale w naszej klasie pomocniczej nie używamy żadnych zmiennych poza tymi, które zostały przekazane (które wykonujemy jako ostateczne) . Z tego powodu nie sądzę, że chcemy pojedynczej instancji, ponieważ nie chcemy żadnych zmiennych i nie chcemy, aby ktokolwiek natychmiastowywał tę klasę. Więc jeśli nie chcesz, aby ktokolwiek tworzył klasę, co jest normalnie, jeśli masz jakąś klasę pomocników/utilsów, to używam tego, co nazywam klasą statyczną, klasy z prywatnym konstruktorem i składa się tylko z metod statycznych bez żadnych dowolne zmienne.

sama odpowiedź jest również odwoływać od mojej odpowiedzi here

+0

Odblokowywanie języka Java może być nadal używane do złamania niezmiennika żadnych instancji dla "klasy statycznej". An [enum solution] (http://shamsmi.blogspot.com/2013/05/emptytons-mimicking-static-classes-in.html) nadal zachowa niezmienniki. – shams

+0

I dlaczego pokonać instancję? Co jeśli potrzebujesz argumentów konstruktora, aby podążać za logiką, a reszta pozostanie statyczna. –

+0

W przykładzie singleton getInstance nie jest bezpieczna dla wątków, wymaga synchronizacji. – kecso

5

różnica nie jest poprawny sposób ask.because singleton nie jest kluczowe w porównaniu do statycznego. powinieneś pytać "Kiedy wybrać, który?". jakie są zalety klasy singleton nad klasą statyczną, pytania te pojawiają się na etapie projektowania.

Singleton: Użycie: klas służących jako konfiguracja globalna, np. Wersja próbna oprogramowania z jednym połączeniem z bazą danych, instancje klasy wykonawczej JDK na jvm.

Kiedy iść: 1. Podczas pracy nad swoim kodem, myślisz o przyszłej kompatybilności, jak jutro, kiedy musisz przekonwertować tę pojedynczą klasę do normalnej klasy lub pozwolić na podklasowanie. 2. Możesz zapewnić funkcję opóźnionego ładowania, gdy ta klasa singletona jest ciężka.

static: Użycie: klas, które w zasadzie wykonuje konwersje, funkcje narzędziowe. sprawdź klasę Math.

Kiedy iść: 1. Klasy pomocnicze, używane przez wszystkie klasy w twoim rozwoju aplikacji.

wada: 1. Ćwiczenia są niecierpliwie ładowane.

oczekiwanie punktów od innych osób.

Powiązane problemy