Singletonとは
Singleton(シングルトン)は、デザインパターンの1つで、そのインスタンスが1つしか生成されないことを保証するパターンです。
シングルトンパターンは、特定のクラスのインスタンスが1つしか存在しないこと、そしてそのインスタンスに簡単にアクセスできるグローバルポイントを提供することを保証するために使用されます。
Singletonの実装例
Go言語では、sync.Once
を使って効率的でスレッドセーフなシングルトンを実装できます。
package singleton
import (
"sync"
)
type Singleton struct {
value string
}
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{value: "Singletonのインスタンス"}
})
return instance
}
func (s *Singleton) GetValue() string {
return s.value
}
上記のコードでは、GetInstance
関数を通してのみSingleton
のインスタンスにアクセスできます。この関数は、初めて呼び出されたときにだけインスタンスを作成し、その後は同じインスタンスを返します。
sync.Once
を使わない場合は以下の様に実装できます。
package singleton
import (
"sync"
)
type Singleton struct {
value string
}
var instance *Singleton
var mutex sync.Mutex
func GetInstance() *Singleton {
if instance == nil {
mutex.Lock()
defer mutex.Unlock()
// 二重確認: instanceがnilであるか再度確認する
if instance == nil {
instance = &Singleton{value: "Singletonのインスタンス"}
}
}
return instance
}
func (s *Singleton) GetValue() string {
return s.value
}
Singletonが使われる具体的なケース
- 設定やリソースの管理: アプリケーションの設定情報を保持するためのクラスが必要な場合、その設定情報がアプリケーション全体で一貫している必要があります。設定情報を持つシングルトンクラスを使用すると、アプリケーションのどこからでも同じ設定情報にアクセスできます。
- ログ管理: ロギングのメカニズムを持つクラスがある場合、そのログの情報を一貫して1つの場所に保持することが望ましいです。ログの情報を一元的に管理するために、シングルトンクラスを使用すると、アプリケーション全体でログの情報が一貫して保持されることを保証できます。