Обмен технологиями

Реализация шаблона Singleton

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Введение

1.1 Предыстория

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

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

1.2 Цель

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

2. Что такое шаблон синглтона?

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

2.1 Преимущества и недостатки шаблона Singleton

преимущество

Обеспечьте единый экземпляр: Избегайте дублирования создания экземпляров и экономьте ресурсы.
глобальная точка доступа: Удобный глобальный доступ и упрощенные вызовы.
Ленивая инициализация: создавайте экземпляры по требованию для повышения производительности.

недостаток

Трудно масштабировать: Классы-одиночки часто сложно расширить, поскольку их конструктор является закрытым.
потенциальные проблемы с производительностью: В среде с высоким уровнем параллелизма некоторые реализации могут иметь проблемы с производительностью.
Сложность в тестировании: шаблон Singleton может затруднить тестирование, поскольку это глобальное состояние.

2.2 Сценарии использования одноэлементного режима

По характеристикам паттерна синглтон сценарии его использования можно разделить на следующие категории:

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

3. Режим реализации одноэлементного режима

Реализация паттерна синглтон обычно включает в себя три элемента:

  1. частный конструктор, сделайте конструктор класса закрытым, чтобы внешний объект не мог создать экземпляр с помощью нового ключевого слова.
  2. Частные статические опорные точки для собственного экземпляра, создайте статическую переменную экземпляра внутри класса, чтобы сохранить уникальный экземпляр.
  3. Публичные статические методы, возвращающие собственный экземпляр., предоставьте статический метод, чтобы внешний мир мог получить единственный экземпляр с помощью этого метода.

3.1 Голодный китайский шаблон Singleton

В режиме Singleton в стиле Hungry экземпляр Singleton создается при загрузке класса, что является потокобезопасным, поскольку статический объект создается при загрузке класса, а скорость ответа при вызове высокая. Недостаток также очевиден: эффективность использования ресурсов невысока, пока выполняются другие статические методы класса или загружается класс, этот экземпляр все равно будет инициализирован.

/**    
 * 饿汉单例模式:在还没有实例化的时候就初始化
 */
public class Hungry {    
  	//1. 开始时就创建实例
	private static final Hungry instance=new Hungry();
	
	// 2. 私有化的构造方法
	private void hungry() {  
	}
	
	public static Hungry getInstance() { 
		// 返回单例名
		return instance;  		
	}
}