Что такое шаблон проектирования Singleton?

1
технологии 26.webp

Последнее обновление 02.01.2023 — Василий Иванов

Одноэлементный шаблон — один из самых простых шаблонов проектирования. Класс, использующий шаблон проектирования singleton, имеет единственный экземпляр, которым он управляет сам по себе. Этот класс не позволяет любому другому классу создать его экземпляр.

Одноэлементный класс также предоставляет единую глобальную точку доступа к экземпляру, который он создает. Таким образом, любой класс, которому нужен экземпляр одноэлементного класса, должен получить к нему доступ через свою единственную точку доступа.

Превосходная поддержка объектно-ориентированного программирования в Java упрощает использование шаблона проектирования singleton.

Реализация шаблона Singleton с использованием Java

Есть много способов реализовать одноэлементный шаблон в Java; нетерпеливый и ленивый подходы являются общими вариациями. Каждый из этих подходов имеет свои достоинства и недостатки. Следовательно, метод, который вы выберете, должен зависеть от того, как будет работать ваше приложение.

Нетерпеливый подход

Реализация одноэлементного шаблона с нетерпеливым подходом означает, что класс создает новый экземпляр самого себя при загрузке.

public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();

private EagerSingleton() {}

public static EagerSingleton getInstance() {
return instance;
}
}

Класс Java EagerSingleton создает новый экземпляр самого себя по мере загрузки. Он присваивает этот экземпляр частной статической переменной экземпляра, которая доступна только внутри класса singleton. Единственная точка внешнего доступа к переменной экземпляра — через метод getInstance(). Этот метод возвращает ранее созданный экземпляр класса.

По теме:  10 лучших советов по iPad для начинающих

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

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

Ленивый подход

Ленивый подход — это решение проблемы нетерпеливого подхода. Это позволяет вам создавать новый экземпляр одноэлементного класса только тогда, когда это необходимо вашей программе.

public class LazySingleton {
private volatile static LazySingleton instance;

private LazySingleton() {}

public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}

return instance;
}
}

Ленивый подход решает проблему многопоточности с помощью ключевого слова synchronized. Это предотвращает одновременный доступ двух потоков к переменной экземпляра. Однако синхронизация стоит дорого, поэтому приложение использует ее только один раз, при первом вызове getInstance().

Когда использовать шаблон Singleton

Шаблон Singleton полезен во многих сценариях для создания диалоговых окон, обработки параметров реестра или управления пулами потоков.

Еще одно распространенное использование шаблона singleton — создание центрального класса, управляющего соединениями с базой данных.