Monday, February 16, 2015

Singleton

Всем привет! Сегодня поговорим о самом известном шаблоне проектирования "Одиночка" (Singleton). О нем уже очень много сказано, но тем не менее - это самый популярный вопрос на собеседованиях.




Singleton - паттерн гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.

Самый общий Singleton, которого хватает почти на 90% задач

public class Singleton {
private static Singleton instance;
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
view raw gistfile1.java hosted with ❤ by GitHub

Какие у него плюсы и минусы:
  • + ленивая инициализация
  • - низкая производительность

Есть более продуктивный шаблон (Double Checked Locking & volatile)

public class Singleton {
public static volatile Singleton instance;
public static Singleton getInstance() {
Singleton local = instance;
if (local == null) {
synchronized(Singleton.class) {
local = instance;
if (local == null) {
instance = local = new Singleton();
}
}
}
return instance;
}
}
view raw gistfile1.java hosted with ❤ by GitHub

Какие у этого шаблона плюсы и минусы:
  • + Ленивая инициализация
  • + Высокая производительность
  • - Поддерживается JDK5+
Есть еще и очень простой Singleton (Enum Singleton)

public enum Singleton {
INSTANCE;
}
view raw gistfile1.java hosted with ❤ by GitHub

Какие у этого шаблона плюсы и минусы:
  • + Сериализация из коробки
  • + Потокобезопасность из коробки
  • + Возможность использования EnumSet, EnumMap и т.д.
  • + Поддержка switch
  • - Неленивая инициализация

No comments: