JavaRush /Blog Java /Random-PL /Wzór Singletona własnymi słowami
Roman_kh
Poziom 33
Харьков

Wzór Singletona własnymi słowami

Opublikowano w grupie Random-PL

Witam wszystkich, javaRush!

Dziś opowiem Wam o wzorze projektowym Singleton(pojedynczym). Wzór Singletona własnymi słowami - 1Cel: 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ę szablonuEnum 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:
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION