JavaRush /Java блог /Random UA /Паттерн Singleton своїми словами
Roman_kh
33 рівень
Харьков

Паттерн Singleton своїми словами

Стаття з групи Random UA

Привіт усім, codeGym!

Розповім сьогодні про патерн проектування Singleton(одинак). Паттерн Singleton своїми словами - 1Мета: створити клас, який матиме лише ОДИН об'єкт. Це означає, що скільки б разів до нього не зверталися, повертатиметься той самий об'єкт, який був створений вперше. Це зручна річ і необхідна у багатьох місцях, недаремно її впроваджують у фреймворки. Застосування:
  • Наприклад, необхідно підключити базу даних до проекту та класу, який відповідатиме за з'єднання з нею. Один раз створюється з'єднання і немає потрібно створювати його знову і знову
  • Application settings— клас, що відповідає за налаштування зброї, які потрібні для застосування: хост і порт бази даних і т.д. Вони створюються один раз і використовуються весь час роботи програми.
  • є ще безліч прикладів, про які я не сказав, тому пишіть у коментарях свої варіанти! =)
Після цього вступу, як я розумію, можна показати вже приклад цього класу: (Хоча я впевнений, що кожен з нас зможе придумати реалізацію цього) Ось найпростіший приклад, коли ми ставимо приватним конструктором, тобто. не можна створювати об'єкт. І є статичний метод getInstance(), який надає об'єкт.
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Є проблеми з багатопоточністю і тоді можна поставити метод getInstance()маркер synchronized:
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Насамкінець, як завжди, хочу сказати, що якщо ви думаєте інакше або знайшли у мене помилку — пишіть у коментарях! Ми всі обговоримо, із задоволенням :) Якщо Вам сподобалася стаття, пишіть "+" і я це знатиму. Це для мене важливо :) PS Додаю ще реалізації: На думку Joshua Bloch 'а це найкращий спосіб реалізації шаблону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;
   }
}
І ще 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;
   }
}
+Лінива ініціалізація +Висока продуктивність -Неможливо використовувати для нестатичних полів класу Будуть запитання/пропозиції — пишіть у коментарі! також мої інші статті:
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ