この記事は https://github.com/tmrts/go-patterns/blob/master/creational/builder.md を勝手に翻訳したものです。なので、内容の正確さは全く保証されてません。なので、気になる人はちゃんとオリジナルのコンテンツを読みましょう。(とはいえ、誤訳は指摘してもらえると嬉しい…
Builder patternとは、複雑なオブジェクトの表現から生成(コンストラクト)を分離させたものであるので、同じコンストラクトの処理で異なる表現を作成することができる。
Goにおいては、通常、設定用のstructが同じふるまいを達成するために使われる。ただし、builder methodにstructを渡すということはif cfg.Field != nil {...}
というチェックのボイラプレートのコードで満たすことができる。
package car
type Speed float64
const (
MPH Speed = 1
KPH = 1.60934
)
type Color string
const (
BlueColor Color = "blue"
GreenColor = "green"
RedColor = "red"
)
type Wheels string
const (
SportsWheels Wheels = "sports"
SteelWheels = "steel"
)
type Builder interface {
Color(Color) Builder
Wheels(Wheels) Builder
TopSpeed(Speed) Builder
Build() Interface
}
type Interface interface {
Drive() error
Stop() error
}
assembly := car.NewBuilder().Paint(car.RedColor)
familyCar := assembly.Wheels(car.SportsWheels).TopSpeed(50 * car.MPH).Build()
familyCar.Drive()
sportsCar := assembly.Wheels(car.SteelWheels).TopSpeed(150 * car.MPH).Build()
sportsCar.Drive()
(これは訳者、つまりこの記事を書いている人の勝手な意見)
同じコンストラクタを使って、パラメータに応じて異なる動作をする何かを生成するときに使えそう。例えば、異なるDBドライバを利用する何かだったり、コンテナのランタイムに応じて内部的な動作を切り替えるドライバ的な何かとか?サンプルコードの車の例はわかりやすくて理解に役立った。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント