Рубрики
4. Полезняшки Java Шаблоны проектирования

Самый лучший Singleton

Из всех существующих на момент написания этого поста реализаций шаблона Singleton (одиночка) мне больше всего нравится эта:

 public class Singleton {
   // Private constructor prevents instantiation from other classes
   private Singleton() {}
 
   /**
    * SingletonHolder is loaded on the first execution of Singleton.getInstance()
    * or the first access to SingletonHolder.INSTANCE, not before.
    */
   private static class SingletonHolder {
     private static final Singleton INSTANCE = new Singleton();
   }
 
   public static Singleton getInstance() {
     return SingletonHolder.INSTANCE;
   }
 }

Эту реализацию придумал  Bill Pugh. Это гениальный и очень простой способ. При помощи элегантного использования внутреннего класса Вы получаете ленивый (объект Singleton не инициализируется до моменты вызова метод getInstance())  и потоко-безопасный Singleton.

Поскольку в классе Singleton нет статических полей которые нужно инициализировать, класс беспрепятственно загрузится. То есть Вам не нужно ждать, пока мы создадим объект Singleton в самом начале, когда загружаются классы.
Смотрим дальше, когда объект INSTANCE будет создан? Тогда, когда мы вызовем метод getInstance(), что повлечет загрузку внутреннего класса SingletonHolder, что спровоцирует создание объекта INSTANCE. Поскольку фаза инициализации класса гарантировано (спецификацией) "не конкурента", то у нас нет необходимости использовать synchronized и volatile. Ура!

Рубрики
2. Теория программирования Шаблоны проектирования

шаблоны проектирования

GoF Шаблоны проектирования

При работе с шаблонами мне интересен был в первую очередь практический аспект.  Сейчас в 2010 году уже существует достаточно много информации и учебников по шаблонам проектирования как в интернете, так и в печатных изданиях.

Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес

"Классикой жанра" считается книжка "банды четырех" (англ: "Gang Of Four" или просто GoF) - книга написанная Эрихом Гаммой и соавторами в 1995 году и посвященная шаблонам проектирования.

Стивен Стелтинг, Олав Маассен. Применение шаблонов Java. Библиотека профессионала

Из книг по шаблоном именно для Java-программистов читал "Применение шаблонов Java".

Описание шаблонов, которые я здесь привожу построено на следующем принципе.

Название шаблона - ссылка на статью в википдеии. Пример - фрагмент java-кода, где  этот шаблон может встречаться в стандартном Java API или в каком-то "бытовом" случае.

Для шаблонов, примеры которых я не смог найти место в стандартной реализации, приводиться просто его краткое описание. Другими словами там, где можно обойтись от использования "оригнальных" и "понятных" примеров ООП - CarFactory, Car, Ford или Fruit, Apple или Person, Student, Prepod и так далее, я старался использовать привычные для программиста StringBuilderMouseAdapter, Reader. Т.е. классы, объекты которых мы используем каждый день.

В любом случае, непосредственно детального описание шаблонов здесь нет. Описание каждого шаблона проектирования можно прочитать либо в книгах, либо в википедии или нагуглить. По мере возможности в статье будут добавлены ссылки на соответствующие термины в википедии.

Creational/Порождающий

AbstractFactory

// Создает DOM Document Builder в зависимости от используемого парсера
DocumentBuilderFactory documentBuilderFactory = ...;
documentBuilderFactory.newDocumentBuilder();