saeki’s blog

The limits of my code mean the limits of my world.

GoFデザインパターン ~Singletonパターン~

こちらを読みながら進める。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

Singletonパターンとは

アプリケーションのスコープにおいてインスタンスがたった一つであることを保証するパターン。直接的なインスタンス生成を制限し、インスタンス生成を一箇所で管理することでSingletonパターンを実現する。

実装

Singletonクラス

増補改訂版Java言語で学ぶデザインパターン入門 のJavaの例ではSingletonクラスのコンストラクタのスコープをprivateにすることで直接的なインスタンス生成を制限してるが、Goでは構造体のスコープをパッケージに限定することでこれを実現する。 インスタンスの取得は GetInstance() でのみ可能となる。
またインスタンス生成の関数を外部に公開せず、パッケージの変数初期化時にインスタンスを生成するようにしている。これはGoにおいて複数スレッドからSingletonクラスを生成される可能性を防ぐためで、他にはinit関数でインスタンスを生成してこれを実現することもできる。

package singleton

type singleton struct{}

var instance = newInstance()

func newInstance() *singleton {
    return &singleton{}
}

func GetInstance() *singleton {
    return instance
}

main

package main

import (
    "fmt"

    "github.com/saekis/go-design-pattern/5_singleton/singleton"
)

func main() {
    for i := 1; i <= 5; i++ {
        go func() {
            singleton.GetInstance()
        }()
    }

    fmt.Scanln()
}

実行結果

$ go run main.go 
Create new instance
Exist instance
Exist instance
Exist instance
Exist instance
Exist instance

実装したもの

github.com