今回はGo言語のデザインパターンについて解説します。デザインパターンとは、ソフトウェア開発における「よくある問題に対する解決策」のようなものです。ここでは、初心者でもわかりやすく、いくつかのデザインパターンとその実装例を紹介します。
シングルトンパターンは、クラスのインスタンスを一つだけ作成し、それを共有するためのパターンです。たとえば、設定情報などはアプリケーション全体で共通のものにしたい場合に使います。
package main
import (
"fmt"
"sync"
)
type singleton struct {
message string
}
var instance *singleton
var once sync.Once
func getInstance() *singleton {
once.Do(func() {
instance = &singleton{message: "I am a singleton instance!"}
})
return instance
}
func main() {
s1 := getInstance()
s2 := getInstance()
fmt.Println(s1.message)
fmt.Println(s1 == s2) // true
}
ファクトリパターンは、オブジェクトを生成するためのインターフェースを定義するパターンです。これにより、ユーザーの要求に応じて、異なるクラスのインスタンスを生成できます。
package main
import "fmt"
type Animal interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string {
return "ワン!"
}
type Cat struct{}
func (c Cat) Speak() string {
return "ニャー!"
}
func animalFactory(animalType string) Animal {
if animalType == "dog" {
return Dog{}
} else if animalType == "cat" {
return Cat{}
}
return nil
}
func main() {
dog := animalFactory("dog")
cat := animalFactory("cat")
fmt.Println(dog.Speak()) // ワン!
fmt.Println(cat.Speak()) // ニャー!
}
ストラテジーパターンは、アルゴリズムをクラスとしてカプセル化し、それを交換可能にするパターンです。これにより、実行時にアルゴリズムを選択できるようになります。
package main
import "fmt"
type Strategy interface {
Execute(int, int) int
}
type AddStrategy struct{}
func (AddStrategy) Execute(a, b int) int {
return a + b
}
type SubtractStrategy struct{}
func (SubtractStrategy) Execute(a, b int) int {
return a - b
}
type Context struct {
strategy Strategy
}
func (c *Context) SetStrategy(s Strategy) {
c.strategy = s
}
func (c *Context) ExecuteStrategy(a, b int) int {
return c.strategy.Execute(a, b)
}
func main() {
context := &Context{}
context.SetStrategy(AddStrategy{})
fmt.Println("Addition:", context.ExecuteStrategy(5, 3)) // Addition: 8
context.SetStrategy(SubtractStrategy{})
fmt.Println("Subtraction:", context.ExecuteStrategy(5, 3)) // Subtraction: 2
}
今回は、Go言語におけるいくつかのデザインパターンを紹介しました。シングルトンパターン、ファクトリパターン、ストラテジーパターンは、特に実用的で頻繁に使用されるパターンです。これらのパターンを応用することで、より保守性の高いコードを書くことができます。