Одиночка (Singleton)
Паттерн Singleton относится к порождающим паттернам уровня объекта. Паттерн контролирует создание единственного экземпляра некоторого класса и предоставляет доступ к нему. Другими словами, Singleton гарантирует, что у класса будет только один экземпляр и предоставляет к нему точку доступа, через фабричный метод.
Требуется для реализации:
- Функция GetInstance, создающая экземпляр класса Singleton только один раз. Если до этого экземпляр уже был создан, то просто возвращает этот экземпляр.
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
//singleton.go
// Package singleton is an example of the Singleton Pattern.
package singleton
import (
"sync"
)
// Singleton implementation.
type Singleton struct {
}
var (
instance *Singleton
once sync.Once
)
// GetInstance returns singleton
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
//singleton_test.go
package singleton
import (
"testing"
)
func TestSingleton(t *testing.T) {
instance1 := GetInstance()
instance2 := GetInstance()
if instance1 != instance2 {
t.Error("Objects are not equal!\n")
}
}