Что такое Singleton паттерн? Это паттерн или антипаттерн?

Паттерн проектирования Singleton гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.

Короткий ответ

Что ответить на собеседовании

Паттерн проектирования Singleton гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.

Подробный разбор

Ответ с пояснениями

Паттерн проектирования Singleton гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.

Плюсы:

  • Контролируемый доступ к единственному экземпляру.
  • Экономия ресурсов при создании дорогостоящего объекта.
  • Разрешает обращение к экземпляру из любого места программы.

Минусы:

  • Нарушает принцип единственной ответственности (класс отвечает и за логику, и за управление своим экземпляром).
  • Может затруднять тестирование (сложно подменить "одиночку" на mock).
  • Создает сильную связанность в коде.

Реализации в Golang:

Конкурентно-безопасная реализация с использованием sync.Once:

package main

import (
	"fmt"
	"sync"
)

type singleton struct{}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
	once.Do(func() {
		instance = &singleton{}
		fmt.Println("Singleton instance created") // Для демонстрации создания
	})
	return instance
}

func main() {
	s1 := GetInstance()
	s2 := GetInstance()

	if s1 == s2 {
		fmt.Println("Both instances are the same")
	} else {
		fmt.Println("Instances are different")
	}
}

Эта реализация гарантирует, что инициализация (создание экземпляра) произойдет только один раз, даже при параллельных вызовах GetInstance. sync.Once — наиболее предпочтительный способ реализации Singleton в Golang.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее