Sunday, December 17, 2017

Singleton: Шаблон программирования

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

public class SimpleSingleton(){
   //сущность
   private static SimpleSingleton simpleSingleton;
   //конструктор
   private SimpleSingleton();
   //инициализация
   public static SimpleSingleton getInstance(){
      if (simpleSingleton==null){
          simpleSingleton = new SimpleSingleton();
      }
      return simpleSingleton;
    }

}

Хоть в реализации и использован приватный конструктор, это никак не означает, что нельзя создать вторую сущность, отличную от первой(создается с помощью изменения конструктора). Для предотвращения такого поведения можно добавить в конструтор эксепш.
private SimpleSingleton(){
    if(simpleSingleton != null)
        throw new RuntimeException("Для получения Синглтона воспользуйтесь методом getInstance().");
}

Для получения потоко-независимого синглтона в объявление метода getInstance() нужно добавить ключевое слово synchronized. В этом случае поток выполнения будет всегда дожидаться окончания работы с объектом. И второй поток не сможет получить управление Singleton'ом. Самый существенный минус такого подхода - медленная производительность.
public synchronized static SimpleSingleton getInstance(){
      if (simpleSingleton==null){
          simpleSingleton = new SimpleSingleton();
      }
      return simpleSingleton;
}
 Аналогичный смысл представляет шаблон Registry (реестр) и Multiton(коллекция синглтонов).

No comments:

Post a Comment