Latest web development tutorials

Singleton

Singleton (Singleton) Java jest jednym z najprostszych wzorca projektowego. Tego rodzaju wzorców projektowych należy stworzyć schemat, który zapewnia najlepszy sposób tworzenia obiektów.

Model ten obejmuje jedną klasę, która jest odpowiedzialna za tworzenie własnych obiektów, zapewniając jednocześnie, że tylko jeden obiekt jest tworzony. Klasa ta zapewnia wyjątkowy przedmiot ich wizyty, można uzyskać bezpośrednio, nie trzeba instancję obiektu tej klasy.

Uwaga:

  • 1, pojedyncza klasa może mieć tylko jedną instancję.
  • 2, pojedyncza klasa musi stworzyć swój własny, unikalny egzemplarz.
  • 3, Singleton klasy musi dostarczyć ten przykład dla wszystkich innych obiektów.

wprowadzenie

Intencja: aby upewnić się, że tylko jedno wystąpienie klasy, oraz zapewnienie globalnego punktu dostępu do niego dostęp.

Głównym rozwiązanie: wykorzystać globalną klasę często tworzone i zniszczone.

Kiedy stosować: Jeśli chcesz kontrolować liczbę przypadków, kiedy zaoszczędzić zasoby systemowe.

Jak rozwiązać: ustalenie, czy system ma już tego pojedynczego przypadku, jeśli się ponownie, jeżeli nie, to utworzony.

Kod klawisza: konstruktor jest prywatny.

Przykłady zastosowań: 1, strona może mieć tylko jednego prezydenta.2, Windows jest multi-proces, wielowątkowy, w operacji pliku kiedy nieuchronnie wiele procesów lub wątków jednocześnie dokumentem zjawiska, przetwarzanie wszystkich plików muszą być wykonywane przez unikalnej instancji. 3, niektóre z menedżera urządzeń jest często zaprojektowany jako pojedynczego przypadku modelu, takiego jak komputer z dwoma drukarkami w razie potrzeby wyjścia do czynienia z dwoma drukarkami nie można wydrukować ten sam plik.

Zalety: 1, tylko jedna instancja w pamięci, redukując narzut pamięci, szczególnie częste przypadki tworzenia i niszczenia (takie jak strona Szkoły Zarządzania Home cache).2, aby uniknąć wielokrotnej zajętości zasobów (takich jak operacje zapisu pliku).

Wady: brak połączenia, nie dziedziczą, a pojedyncza zasada odpowiedzialności konflikt, klasa powinna być tylko zaniepokojony logiki wewnętrznej, a nie na zewnątrz, jak jak instancję.

Scenariusze użycia: 1, wymagają przedstawienia unikalnym numerem seryjnym.2, liczniki, nie każda baza danych w Rydze po jednym przypadku w celu odświeżenia pamięci podręcznej. 3, obiekt utworzony przez potrzebę nadmiernego zużycia surowców, takich jak I / O połączenie z bazą danych i tak dalej.

Uwaga: getInstance () metoda wymaga zastosowania synchronizacji Blokada zsynchronizowany (Singleton.class), aby zapobiec wielu wątków na przykład powodują jest tworzony wielokrotnie.

realizacja

Stworzymy klasęSingleObject.SingleObject klasa ma swój własny prywatny konstruktora i statycznego instancji.

SingleObjectklasy zapewnia statyczną metodę uzyskiwania poza jego statycznej instancji.SingletonPatternDemo,nasze zajęcia demonstracyjne wykorzystujące klasęSingleObjectdostaćSingleObjectobiekt.

Singleton diagram UML

Etap 1

Tworzenie klasy Singleton.

SingleObject.java

{public class SingleObject

   // Utwórz obiekt SingleObject private static SingleObject przykład = new SingleObject ();

   // Dokonaj konstruktora prywatny, więc klasa nie zostanie instancja prywatną SingleObject () {}

   // Pobierz jedyny przedmiot publicznego statycznego SingleObject getInstance () {
      powrócić instancji;
   }

   public void ShowMessage () {
      System.out.println ( "Hello World!");
   }
}

Etap 2

Zdobądź unikalny obiekt z singleton klasy.

SingletonPatternDemo.java

{public class SingletonPatternDemo
   public static void main (String [] args) {

      // // Konstruktor nielegalne Błąd kompilacji: Konstruktor SingleObject () nie jest widoczny // SingleObject obiekt = new SingleObject ();

      // Pobierz jedynym obiektem dostępne SingleObject obiekt = SingleObject.getInstance ();

      // Komunikat na wyświetlaczu object.showMessage ();
   }
}

etap 3,

Sprawdź, czy wyjście.

Hello World!

Kilka implementacja wzorca Singleton

Wdrożenie Singleton szereg sposobów, w następujący sposób:

1, leniwy styl, bezpieczny wątku

Są leniwe inicjowanie: Tak

Są bezpieczne wielowątkowym: Nie

Osiągnąć trudności: Łatwy

Opis: Metoda ta jest najbardziej podstawowym sposobem osiągnięcia tego wdrożenia największym problemem nie obsługuje wielowątkowości.Ponieważ nie ma blokady zsynchronizowane, tak ścisłym znaczeniu nie jest pojedyncza.
Lazy loading w ten sposób oczywiście nie wymagają bezpieczeństwa wątku, pracę w wielowątkowy nie działa.

Przykłady kodu:

public class Singleton {  
    private static Singleton instancji;  
    prywatnych Singleton () {}  
  
    public static Singleton getInstance () {  
    if (wystąpienie == null) {  
        Instancja = new Singleton ();  
    }  
    powrócić instancji;  
    }  
}  

Kolejna prezentacja kilku wdrożeń obsługuje wiele wątków, ale różnią się pod względem funkcjonalnym.

2, leniwy styl, bezpieczny wątku

Są leniwe inicjowanie: Tak

Są bezpieczne wielowątkowym: Tak

Osiągnąć trudności: Łatwy

Opis: w ten sposób mają dobrze lazy ładowania, może pracować również w wielu nici, jest jednak bardzo niska wydajność, 99% przypadków nie wymaga synchronizacji.
Zalety: Pierwszy nabór został zainicjowany, aby uniknąć pamięć zmarnowany.
Wady: należy zablokować zsynchronizowane, aby zapewnić pojedynczy przypadek, ale zamek wpłynie na wydajność.
getInstance () wykonanie wniosku nie jest krytyczna (które wykorzystują rzadziej).

Przykłady kodu:

public class Singleton {  
    private static Singleton instancji;  
    prywatnych Singleton () {}  
    public static Singleton zsynchronizowane getInstance () {  
    if (wystąpienie == null) {  
        Instancja = new Singleton ();  
    }  
    powrócić instancji;  
    }  
} 

3, głodu formuła

Są leniwe inicjowanie: Nie

Są bezpieczne wielowątkowym: Tak

Osiągnąć trudności: Łatwy

Opis: To jest bardziej powszechne, ale podatne na obiektach śmieci.
Uwagi: Nie zamknięte sprawność jest lepsza.
Wady: ładowarka klasa jest inicjowany, pamięć jest marnowana.
Jest on oparty na mechanizmie classloder unika synchronizacji wielowątkowość jednak wystąpienie gdy jest instancja klasy loader, chociaż klasa przyczyną ładowania różnych powodów większość wzorzec Singleton jest wywołanie metody getInstance, ale nie można określić istnieją inne sposoby (lub inne metody statyczne) prowadzi do klasy załadunku, tym razem najwyraźniej nie osiągnął instancji inicjalizacji efekt leniwego ładowania.

Przykłady kodu:

public class Singleton {  
    private static instancji Singleton = new Singleton ();  
    prywatnych Singleton () {}  
    public static Singleton getInstance () {  
    powrócić instancji;  
    }  
}  

4, blokada double-check / podwójna blokada kontroli (DCL, czyli Blokada z podwójnym zatwierdzeniem)

wersja JDK: JDK1.5 od

Są leniwe inicjowanie: Tak

Są bezpieczne wielowątkowym: Tak

Sobie sprawę z trudności: bardziej złożone

Opis: Metoda ta wykorzystuje podwójny mechanizm blokujący, bezpieczeństwa, a w przypadku wielu wątków, aby utrzymać wysoką wydajność.
getInstance () wykonywanie aplikacji jest krytyczna.

Przykłady kodu:

public class Singleton {  
    private static volatile Singleton Singleton;  
    prywatnych Singleton () {}  
    public static Singleton getSingleton () {  
    if (Singleton == null) {  
        zsynchronizowane (Singleton.class) {  
        if (Singleton == null) {  
            Singleton = new Singleton ();  
        }  
        }  
    }  
    powrót singleton;  
    }  
}  

5, rodzaj rejestracji / statyczne klasy wewnętrzne

Są leniwe inicjowanie: Tak

Są bezpieczne wielowątkowym: Tak

Sobie sprawę z trudności: Ogólne

Opis: Ta metoda może osiągnąć tryb blokady dokładnie sprawdzić sam efekt, ale realizacja łatwiejsze.Użyj leniwe inicjowanie pola statycznego należy stosować w ten sposób, zamiast dwukrotnie sprawdzić tryb blokady. Dotyczy to tylko przypadku statycznego pola dwukrotnie sprawdzić tryb blokady można użyć w razie potrzeby opóźnienie inicjalizacji pól instancji.
Podejście to wykorzystuje również mechanizmy classloder aby upewnić się, że tylko jeden wątek instancji inicjalizacji, to jest z 3 różnych sposobów jest: dopóki trzeciej drogi klasy Singleton jest ładowany, instancja jest tworzony (nie osiągnęły lazy loading efekt), ale to podejście jest klasa Singleton załadowaniu przykład może być zainicjowana. Ponieważ klasa SingletonHolder nie jest aktywnie używany, wyświetlany tylko przez wywołanie metody getInstance pojawia załadować klasę SingletonHolder, który jest tworzony instancji. Wyobraź sobie, jeśli wystąpienia wystąpienie znacznych zasobów, więc chciał opóźnić załadunek, z drugiej strony, jeśli nie chcesz instancję programu ładującego klasy Singleton, ponieważ nie może zapewnić klasy Singleton może być również aktywna w innych dziedzinach, tak aby być załadowany, tym razem do instancji instancji wyraźnie nieodpowiednie. Tym razem, w ten sposób, w porównaniu do pierwszych trzech rodzajów sposobów jest bardzo rozsądne.

Przykłady kodu:

public class Singleton {  
    prywatnych klasy statyczne SingletonHolder {  
    private static final Singleton ZDARZEŃ = new Singleton ();  
    }  
    prywatnych Singleton () {}  
    public static final Singleton getInstance () {  
    powrót SingletonHolder.INSTANCE;  
    }  
}   

6, wyliczyć

wersja JDK: JDK1.5 od

Są leniwe inicjowanie: Nie

Są bezpieczne wielowątkowym: Tak

Osiągnąć trudności: Łatwy

Opis: Jest to realizacja nie została jeszcze powszechnie przyjęte, ale to jest najlepszym sposobem na wdrożenie Singleton.To jest bardziej zwięzły, automatyczny mechanizm wsparcia serializacji, aby zapobiec wielu wystąpień absolutu.
Takie podejście jest autorem Efektywna Java Josh Bloch opowiada sposób, że może to nie tylko uniknąć problemów z synchronizacją wielowątkowego, ale również automatycznie obsługuje mechanizm serializacji aby zapobiec deserializacji ponownie utworzyć nowy obiekt, absolutnie zapobiec wielu instancji. Jednakże, ponieważ dołączył dopiero po właściwości enum JDK1.5, pisać w ten sposób nie może pomóc, ale czuję dziwne, w praktyce rzadko stosowany.
Nie atakiem refleksji zadzwonić prywatny konstruktor.

Przykłady kodu:

public enum Singleton {  
    instancji;  
    public void whateverMethod () {  
    }  
}  

Zasada: W normalnych warunkach, nie zaleca korzystania z pierwszego rodzaju i drugiego rodzaju leniwe sposób, to zaleca się stosowanie trzecia droga głodny człowiek.Tylko wtedy, gdy chcesz wprowadzić lazy loading Efekt jest jasne, będziemy używać pierwszych pięć rodzajów sposobów, aby zarejestrować. Jeśli chodzi o deserializowania obiektów do tworzenia, można spróbować użyć trybu wyliczenia szósty. Jeśli masz inne specjalne potrzeby, można rozważyć użycie czwartego dokładnie sprawdzić tryb blokady.