【Goで学ぶデザインパターン】Singletonとは

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. 設定やリソースの管理: アプリケーションの設定情報を保持するためのクラスが必要な場合、その設定情報がアプリケーション全体で一貫している必要があります。設定情報を持つシングルトンクラスを使用すると、アプリケーションのどこからでも同じ設定情報にアクセスできます。
  2. ログ管理: ロギングのメカニズムを持つクラスがある場合、そのログの情報を一貫して1つの場所に保持することが望ましいです。ログの情報を一元的に管理するために、シングルトンクラスを使用すると、アプリケーション全体でログの情報が一貫して保持されることを保証できます。

デザインパターン: Singletonが学べる教材

動画教材

技術書籍

-Golang
-