Roman_kh
33 уровень
Харьков

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

Пост из группы Архив info.javarush.ru
2599 участников
Привет всем, javaRush!

Расскажу сегодня про паттерн проектирования Singleton(одиночка).

Цель: Создать класс, у которого будет только ОДИН объект.

Это значит, что сколько бы раз к нему не обращались, возвращаться будет один и тот же объект, который был создан первый раз.

Это удобная вещь и необходимая во многих местах, не зря ее внедряют во фреймворки.
Применение
  • Например необходимо подключить базу данных в проект и класс, который будет отвечать за соединение с ней. Один раз создается соединение и нет нужны создавать его снова и снова
  • 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; } }

    В конце, как обычно, хочу сказать, что если вы думаете иначе или нашли у меня ошибку - пишите в комментариях! Мы все обсудим, с удовольствием :)

    Если Вам понравилась статья, пишите "+" и я буду это знать. Это для меня важно :)
P.S. Добавляю еще реализации:

По мнению 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; } }
+ Ленивая инициализация + Высокая производительность - Невозможно использовать для не статических полей класса

Будут вопросы/предложения - пишите в комментарии!


См. также мои другие статьи:
Тестовое задание: "Написать Интерпретатор на язык BrainFuck"
Тестовое задание "Image Comparison" Java - быстрее, сильнее и выше! Зарплаты украинских программистов. История успеха спустя 1.5 года от начала обучения
Технические вопросы на собеседовании.
Как найти работу? Рассылка резюме
Профессиональное выгорание. Как устоять?
Английский для IT и для собеседования
Паттерн Command своими словами.
Паттерн Singleton своими словами.
Как создать исполняемый jar в Intellij IDEA / how to create jar in IDEA
Помогите, нужна мотивация!

Подписывайтесь на мой блог Паттерны Проектирования пишите в нем статьи!