Назад к вопросам
Junior
139
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн проектирования 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.