Singleton【Go】
オブジェクト指向のデザインパターンである、Singletonを実装する例です。
type Menu struct { name string price int } var mymenu *Menu = newMenu("未定", 0) // 定義時に func newMenu(name string, price int) *Menu { // コンストラクタのように初期化処理。ただし、頭文字は小文字にして"private"扱いにする return &Menu{name: name, price: price} } func GetMenu() *Menu { // getterを通して同じものを返す。初期化処理が"private"な代わりに、getterを"public"に return mymenu } func (menu *Menu) Assign(name string, price int) { menu.name = name menu.price = price } func main() { fmt.Println(*GetMenu()) mymenu.Assign("スープ", 750) fmt.Println(*GetMenu()) }
Singletonを利用することで、マルチスレッドなどによって
インスタンス生成処理が同時に発生しそうな状況下でも、
インスタンスの生成は1度に限定されます。
getterをpublicな状態とすることで、プログラム全体で1つのインスタンスを共有することになります。
シンプルな設計につながりますが、一方で弊害もあるようです。
それはコード間に依存関係を生んでしまう、ということです。
特に「疎結合が前提」の単体テストではその影響が顕著になるとのことです。
(詳細は参考資料2番目を参照)
マルチスレッドを安全にこなす方法には、他にもMutexがありますので、
Singletonを使用する際には、事前によく検討するべきかもしれません。
参考
サルでもわかる 逆引きデザインパターン 第2章 逆引きカタログ ロジック編 Singleton(シングルトン)
プログラマが知るべき97のこと/シングルトンパターンの誘惑に負けない - Wikisource