Witam wszystkich, javaRush!
Dziś opowiem Wam o wzorze projektowym
Singleton
(pojedynczym).
Cel: utwórz klasę, która będzie miała tylko JEDEN obiekt. Oznacza to, że niezależnie od tego, ile razy uzyskano do niego dostęp, zwrócony zostanie ten sam obiekt, który został utworzony za pierwszym razem. Jest to rzecz wygodna i konieczna w wielu miejscach, nie bez powodu jest wdrażana do frameworków.
Aplikacja:
- Przykładowo musisz podłączyć bazę danych do projektu i klasę, która będzie odpowiedzialna za połączenie się z nim. Połączenie tworzy się raz i nie ma potrzeby tworzenia go ponownie
Application settings
— klasa odpowiedzialna za ustawienia połączenia potrzebne aplikacji: host i port bazy danych itp. Są tworzone jednorazowo i wykorzystywane przez cały czas działania aplikacji.
- Jest wiele innych przykładów, o których nie wspomniałem, więc napisz swoje opcje w komentarzach! =)
Po tym wstępie, jak rozumiem, możemy pokazać przykład tej klasy: (Chociaż jestem pewien, że każdy z nas może wymyślić taką implementację) Oto najprostszy przykład, gdy konstruktor uczynimy prywatnym, tj. Nie można jawnie utworzyć obiektu. Istnieje metoda statyczna
getInstance()
, która zapewnia obiekt.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Występują problemy z wielowątkowością i wtedy możesz umieścić metodę
getInstance()
znacznika
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Na koniec, jak zwykle, chcę powiedzieć, że jeśli myślisz inaczej lub znajdziesz u mnie błąd, napisz w komentarzach! Z przyjemnością wszystko omówimy :) Jeśli artykuł przypadł Ci do gustu, napisz „+”, a ja się o tym dowiem. To dla mnie ważne :) PS Dodaję kolejne implementacje: Według
Joshuy Blocha jest to najlepszy sposób na implementację szablonu
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
I dalej
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
Leniwa inicjalizacja
+
Wysoka wydajność
-
Nie można używać dla niestatycznych pól klas. Wszelkie pytania/sugestie - pisz w komentarzach!
Zobacz także inne moje artykuły:
GO TO FULL VERSION